| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746 | define('echarts/chart/pie', [    'require',    './base',    'zrender/shape/Text',    'zrender/shape/Ring',    'zrender/shape/Circle',    'zrender/shape/Sector',    'zrender/shape/Polyline',    '../config',    '../util/ecData',    'zrender/tool/util',    'zrender/tool/math',    'zrender/tool/color',    '../chart'], function (require) {    var ChartBase = require('./base');    var TextShape = require('zrender/shape/Text');    var RingShape = require('zrender/shape/Ring');    var CircleShape = require('zrender/shape/Circle');    var SectorShape = require('zrender/shape/Sector');    var PolylineShape = require('zrender/shape/Polyline');    var ecConfig = require('../config');    ecConfig.pie = {        zlevel: 0,        z: 2,        clickable: true,        legendHoverLink: true,        center: [            '50%',            '50%'        ],        radius: [            0,            '75%'        ],        clockWise: true,        startAngle: 90,        minAngle: 0,        selectedOffset: 10,        itemStyle: {            normal: {                borderColor: 'rgba(0,0,0,0)',                borderWidth: 1,                label: {                    show: true,                    position: 'outer'                },                labelLine: {                    show: true,                    length: 20,                    lineStyle: {                        width: 1,                        type: 'solid'                    }                }            },            emphasis: {                borderColor: 'rgba(0,0,0,0)',                borderWidth: 1,                label: { show: false },                labelLine: {                    show: false,                    length: 20,                    lineStyle: {                        width: 1,                        type: 'solid'                    }                }            }        }    };    var ecData = require('../util/ecData');    var zrUtil = require('zrender/tool/util');    var zrMath = require('zrender/tool/math');    var zrColor = require('zrender/tool/color');    function Pie(ecTheme, messageCenter, zr, option, myChart) {        ChartBase.call(this, ecTheme, messageCenter, zr, option, myChart);        var self = this;        self.shapeHandler.onmouseover = function (param) {            var shape = param.target;            var seriesIndex = ecData.get(shape, 'seriesIndex');            var dataIndex = ecData.get(shape, 'dataIndex');            var percent = ecData.get(shape, 'special');            var center = [                shape.style.x,                shape.style.y            ];            var startAngle = shape.style.startAngle;            var endAngle = shape.style.endAngle;            var midAngle = ((endAngle + startAngle) / 2 + 360) % 360;            var defaultColor = shape.highlightStyle.color;            var label = self.getLabel(seriesIndex, dataIndex, percent, center, midAngle, defaultColor, true);            if (label) {                self.zr.addHoverShape(label);            }            var labelLine = self.getLabelLine(seriesIndex, dataIndex, center, shape.style.r0, shape.style.r, midAngle, defaultColor, true);            if (labelLine) {                self.zr.addHoverShape(labelLine);            }        };        this.refresh(option);    }    Pie.prototype = {        type: ecConfig.CHART_TYPE_PIE,        _buildShape: function () {            var series = this.series;            var legend = this.component.legend;            this.selectedMap = {};            this._selected = {};            var center;            var radius;            var pieCase;            this._selectedMode = false;            var serieName;            for (var i = 0, l = series.length; i < l; i++) {                if (series[i].type === ecConfig.CHART_TYPE_PIE) {                    series[i] = this.reformOption(series[i]);                    this.legendHoverLink = series[i].legendHoverLink || this.legendHoverLink;                    serieName = series[i].name || '';                    this.selectedMap[serieName] = legend ? legend.isSelected(serieName) : true;                    if (!this.selectedMap[serieName]) {                        continue;                    }                    center = this.parseCenter(this.zr, series[i].center);                    radius = this.parseRadius(this.zr, series[i].radius);                    this._selectedMode = this._selectedMode || series[i].selectedMode;                    this._selected[i] = [];                    if (this.deepQuery([                            series[i],                            this.option                        ], 'calculable')) {                        pieCase = {                            zlevel: this.getZlevelBase(),                            z: this.getZBase(),                            hoverable: false,                            style: {                                x: center[0],                                y: center[1],                                r0: radius[0] <= 10 ? 0 : radius[0] - 10,                                r: radius[1] + 10,                                brushType: 'stroke',                                lineWidth: 1,                                strokeColor: series[i].calculableHolderColor || this.ecTheme.calculableHolderColor || ecConfig.calculableHolderColor                            }                        };                        ecData.pack(pieCase, series[i], i, undefined, -1);                        this.setCalculable(pieCase);                        pieCase = radius[0] <= 10 ? new CircleShape(pieCase) : new RingShape(pieCase);                        this.shapeList.push(pieCase);                    }                    this._buildSinglePie(i);                    this.buildMark(i);                }            }            this.addShapeList();        },        _buildSinglePie: function (seriesIndex) {            var series = this.series;            var serie = series[seriesIndex];            var data = serie.data;            var legend = this.component.legend;            var itemName;            var totalSelected = 0;            var totalSelectedValue0 = 0;            var totalValue = 0;            var maxValue = Number.NEGATIVE_INFINITY;            var singleShapeList = [];            for (var i = 0, l = data.length; i < l; i++) {                itemName = data[i].name;                this.selectedMap[itemName] = legend ? legend.isSelected(itemName) : true;                if (this.selectedMap[itemName] && !isNaN(data[i].value)) {                    if (+data[i].value !== 0) {                        totalSelected++;                    } else {                        totalSelectedValue0++;                    }                    totalValue += +data[i].value;                    maxValue = Math.max(maxValue, +data[i].value);                }            }            if (totalValue === 0) {                return;            }            var percent = 100;            var clockWise = serie.clockWise;            var startAngle = (serie.startAngle.toFixed(2) - 0 + 360) % 360;            var endAngle;            var minAngle = serie.minAngle || 0.01;            var totalAngle = 360 - minAngle * totalSelected - 0.01 * totalSelectedValue0;            var defaultColor;            var roseType = serie.roseType;            var center;            var radius;            var r0;            var r1;            for (var i = 0, l = data.length; i < l; i++) {                itemName = data[i].name;                if (!this.selectedMap[itemName] || isNaN(data[i].value)) {                    continue;                }                defaultColor = legend ? legend.getColor(itemName) : this.zr.getColor(i);                percent = data[i].value / totalValue;                if (roseType != 'area') {                    endAngle = clockWise ? startAngle - percent * totalAngle - (percent !== 0 ? minAngle : 0.01) : percent * totalAngle + startAngle + (percent !== 0 ? minAngle : 0.01);                } else {                    endAngle = clockWise ? startAngle - 360 / l : 360 / l + startAngle;                }                endAngle = endAngle.toFixed(2) - 0;                percent = (percent * 100).toFixed(2);                center = this.parseCenter(this.zr, serie.center);                radius = this.parseRadius(this.zr, serie.radius);                r0 = +radius[0];                r1 = +radius[1];                if (roseType === 'radius') {                    r1 = data[i].value / maxValue * (r1 - r0) * 0.8 + (r1 - r0) * 0.2 + r0;                } else if (roseType === 'area') {                    r1 = Math.sqrt(data[i].value / maxValue) * (r1 - r0) + r0;                }                if (clockWise) {                    var temp;                    temp = startAngle;                    startAngle = endAngle;                    endAngle = temp;                }                this._buildItem(singleShapeList, seriesIndex, i, percent, data[i].selected, center, r0, r1, startAngle, endAngle, defaultColor);                if (!clockWise) {                    startAngle = endAngle;                }            }            this._autoLabelLayout(singleShapeList, center, r1);            for (var i = 0, l = singleShapeList.length; i < l; i++) {                this.shapeList.push(singleShapeList[i]);            }            singleShapeList = null;        },        _buildItem: function (singleShapeList, seriesIndex, dataIndex, percent, isSelected, center, r0, r1, startAngle, endAngle, defaultColor) {            var series = this.series;            var midAngle = ((endAngle + startAngle) / 2 + 360) % 360;            var sector = this.getSector(seriesIndex, dataIndex, percent, isSelected, center, r0, r1, startAngle, endAngle, defaultColor);            ecData.pack(sector, series[seriesIndex], seriesIndex, series[seriesIndex].data[dataIndex], dataIndex, series[seriesIndex].data[dataIndex].name, percent);            singleShapeList.push(sector);            var label = this.getLabel(seriesIndex, dataIndex, percent, center, midAngle, defaultColor, false);            var labelLine = this.getLabelLine(seriesIndex, dataIndex, center, r0, r1, midAngle, defaultColor, false);            if (labelLine) {                ecData.pack(labelLine, series[seriesIndex], seriesIndex, series[seriesIndex].data[dataIndex], dataIndex, series[seriesIndex].data[dataIndex].name, percent);                singleShapeList.push(labelLine);            }            if (label) {                ecData.pack(label, series[seriesIndex], seriesIndex, series[seriesIndex].data[dataIndex], dataIndex, series[seriesIndex].data[dataIndex].name, percent);                label._labelLine = labelLine;                singleShapeList.push(label);            }        },        getSector: function (seriesIndex, dataIndex, percent, isSelected, center, r0, r1, startAngle, endAngle, defaultColor) {            var series = this.series;            var serie = series[seriesIndex];            var data = serie.data[dataIndex];            var queryTarget = [                data,                serie            ];            var normal = this.deepMerge(queryTarget, 'itemStyle.normal') || {};            var emphasis = this.deepMerge(queryTarget, 'itemStyle.emphasis') || {};            var normalColor = this.getItemStyleColor(normal.color, seriesIndex, dataIndex, data) || defaultColor;            var emphasisColor = this.getItemStyleColor(emphasis.color, seriesIndex, dataIndex, data) || (typeof normalColor === 'string' ? zrColor.lift(normalColor, -0.2) : normalColor);            var sector = {                zlevel: this.getZlevelBase(),                z: this.getZBase(),                clickable: this.deepQuery(queryTarget, 'clickable'),                style: {                    x: center[0],                    y: center[1],                    r0: r0,                    r: r1,                    startAngle: startAngle,                    endAngle: endAngle,                    brushType: 'both',                    color: normalColor,                    lineWidth: normal.borderWidth,                    strokeColor: normal.borderColor,                    lineJoin: 'round'                },                highlightStyle: {                    color: emphasisColor,                    lineWidth: emphasis.borderWidth,                    strokeColor: emphasis.borderColor,                    lineJoin: 'round'                },                _seriesIndex: seriesIndex,                _dataIndex: dataIndex            };            if (isSelected) {                var midAngle = ((sector.style.startAngle + sector.style.endAngle) / 2).toFixed(2) - 0;                sector.style._hasSelected = true;                sector.style._x = sector.style.x;                sector.style._y = sector.style.y;                var offset = this.query(serie, 'selectedOffset');                sector.style.x += zrMath.cos(midAngle, true) * offset;                sector.style.y -= zrMath.sin(midAngle, true) * offset;                this._selected[seriesIndex][dataIndex] = true;            } else {                this._selected[seriesIndex][dataIndex] = false;            }            if (this._selectedMode) {                sector.onclick = this.shapeHandler.onclick;            }            if (this.deepQuery([                    data,                    serie,                    this.option                ], 'calculable')) {                this.setCalculable(sector);                sector.draggable = true;            }            if (this._needLabel(serie, data, true) || this._needLabelLine(serie, data, true)) {                sector.onmouseover = this.shapeHandler.onmouseover;            }            sector = new SectorShape(sector);            return sector;        },        getLabel: function (seriesIndex, dataIndex, percent, center, midAngle, defaultColor, isEmphasis) {            var series = this.series;            var serie = series[seriesIndex];            var data = serie.data[dataIndex];            if (!this._needLabel(serie, data, isEmphasis)) {                return;            }            var status = isEmphasis ? 'emphasis' : 'normal';            var itemStyle = zrUtil.merge(zrUtil.clone(data.itemStyle) || {}, serie.itemStyle);            var labelControl = itemStyle[status].label;            var textStyle = labelControl.textStyle || {};            var centerX = center[0];            var centerY = center[1];            var x;            var y;            var radius = this.parseRadius(this.zr, serie.radius);            var textAlign;            var textBaseline = 'middle';            labelControl.position = labelControl.position || itemStyle.normal.label.position;            if (labelControl.position === 'center') {                x = centerX;                y = centerY;                textAlign = 'center';            } else if (labelControl.position === 'inner' || labelControl.position === 'inside') {                radius = (radius[0] + radius[1]) * (labelControl.distance || 0.5);                x = Math.round(centerX + radius * zrMath.cos(midAngle, true));                y = Math.round(centerY - radius * zrMath.sin(midAngle, true));                defaultColor = '#fff';                textAlign = 'center';            } else {                radius = radius[1] - -itemStyle[status].labelLine.length;                x = Math.round(centerX + radius * zrMath.cos(midAngle, true));                y = Math.round(centerY - radius * zrMath.sin(midAngle, true));                textAlign = midAngle >= 90 && midAngle <= 270 ? 'right' : 'left';            }            if (labelControl.position != 'center' && labelControl.position != 'inner' && labelControl.position != 'inside') {                x += textAlign === 'left' ? 20 : -20;            }            data.__labelX = x - (textAlign === 'left' ? 5 : -5);            data.__labelY = y;            var ts = new TextShape({                zlevel: this.getZlevelBase(),                z: this.getZBase() + 1,                hoverable: false,                style: {                    x: x,                    y: y,                    color: textStyle.color || defaultColor,                    text: this.getLabelText(seriesIndex, dataIndex, percent, status),                    textAlign: textStyle.align || textAlign,                    textBaseline: textStyle.baseline || textBaseline,                    textFont: this.getFont(textStyle)                },                highlightStyle: { brushType: 'fill' }            });            ts._radius = radius;            ts._labelPosition = labelControl.position || 'outer';            ts._rect = ts.getRect(ts.style);            ts._seriesIndex = seriesIndex;            ts._dataIndex = dataIndex;            return ts;        },        getLabelText: function (seriesIndex, dataIndex, percent, status) {            var series = this.series;            var serie = series[seriesIndex];            var data = serie.data[dataIndex];            var formatter = this.deepQuery([                data,                serie            ], 'itemStyle.' + status + '.label.formatter');            if (formatter) {                if (typeof formatter === 'function') {                    return formatter.call(this.myChart, {                        seriesIndex: seriesIndex,                        seriesName: serie.name || '',                        series: serie,                        dataIndex: dataIndex,                        data: data,                        name: data.name,                        value: data.value,                        percent: percent                    });                } else if (typeof formatter === 'string') {                    formatter = formatter.replace('{a}', '{a0}').replace('{b}', '{b0}').replace('{c}', '{c0}').replace('{d}', '{d0}');                    formatter = formatter.replace('{a0}', serie.name).replace('{b0}', data.name).replace('{c0}', data.value).replace('{d0}', percent);                    return formatter;                }            } else {                return data.name;            }        },        getLabelLine: function (seriesIndex, dataIndex, center, r0, r1, midAngle, defaultColor, isEmphasis) {            var series = this.series;            var serie = series[seriesIndex];            var data = serie.data[dataIndex];            if (this._needLabelLine(serie, data, isEmphasis)) {                var status = isEmphasis ? 'emphasis' : 'normal';                var itemStyle = zrUtil.merge(zrUtil.clone(data.itemStyle) || {}, serie.itemStyle);                var labelLineControl = itemStyle[status].labelLine;                var lineStyle = labelLineControl.lineStyle || {};                var centerX = center[0];                var centerY = center[1];                var minRadius = r1;                var maxRadius = this.parseRadius(this.zr, serie.radius)[1] - -labelLineControl.length;                var cosValue = zrMath.cos(midAngle, true);                var sinValue = zrMath.sin(midAngle, true);                return new PolylineShape({                    zlevel: this.getZlevelBase(),                    z: this.getZBase() + 1,                    hoverable: false,                    style: {                        pointList: [                            [                                centerX + minRadius * cosValue,                                centerY - minRadius * sinValue                            ],                            [                                centerX + maxRadius * cosValue,                                centerY - maxRadius * sinValue                            ],                            [                                data.__labelX,                                data.__labelY                            ]                        ],                        strokeColor: lineStyle.color || defaultColor,                        lineType: lineStyle.type,                        lineWidth: lineStyle.width                    },                    _seriesIndex: seriesIndex,                    _dataIndex: dataIndex                });            } else {                return;            }        },        _needLabel: function (serie, data, isEmphasis) {            return this.deepQuery([                data,                serie            ], 'itemStyle.' + (isEmphasis ? 'emphasis' : 'normal') + '.label.show');        },        _needLabelLine: function (serie, data, isEmphasis) {            return this.deepQuery([                data,                serie            ], 'itemStyle.' + (isEmphasis ? 'emphasis' : 'normal') + '.labelLine.show');        },        _autoLabelLayout: function (sList, center, r) {            var leftList = [];            var rightList = [];            for (var i = 0, l = sList.length; i < l; i++) {                if (sList[i]._labelPosition === 'outer' || sList[i]._labelPosition === 'outside') {                    sList[i]._rect._y = sList[i]._rect.y;                    if (sList[i]._rect.x < center[0]) {                        leftList.push(sList[i]);                    } else {                        rightList.push(sList[i]);                    }                }            }            this._layoutCalculate(leftList, center, r, -1);            this._layoutCalculate(rightList, center, r, 1);        },        _layoutCalculate: function (tList, center, r, direction) {            tList.sort(function (a, b) {                return a._rect.y - b._rect.y;            });            function _changeDown(start, end, delta, direction) {                for (var j = start; j < end; j++) {                    tList[j]._rect.y += delta;                    tList[j].style.y += delta;                    if (tList[j]._labelLine) {                        tList[j]._labelLine.style.pointList[1][1] += delta;                        tList[j]._labelLine.style.pointList[2][1] += delta;                    }                    if (j > start && j + 1 < end && tList[j + 1]._rect.y > tList[j]._rect.y + tList[j]._rect.height) {                        _changeUp(j, delta / 2);                        return;                    }                }                _changeUp(end - 1, delta / 2);            }            function _changeUp(end, delta) {                for (var j = end; j >= 0; j--) {                    tList[j]._rect.y -= delta;                    tList[j].style.y -= delta;                    if (tList[j]._labelLine) {                        tList[j]._labelLine.style.pointList[1][1] -= delta;                        tList[j]._labelLine.style.pointList[2][1] -= delta;                    }                    if (j > 0 && tList[j]._rect.y > tList[j - 1]._rect.y + tList[j - 1]._rect.height) {                        break;                    }                }            }            function _changeX(sList, isDownList, center, r, direction) {                var x = center[0];                var y = center[1];                var deltaX;                var deltaY;                var length;                var lastDeltaX = direction > 0 ? isDownList ? Number.MAX_VALUE : 0 : isDownList ? Number.MAX_VALUE : 0;                for (var i = 0, l = sList.length; i < l; i++) {                    deltaY = Math.abs(sList[i]._rect.y - y);                    length = sList[i]._radius - r;                    deltaX = deltaY < r + length ? Math.sqrt((r + length + 20) * (r + length + 20) - Math.pow(sList[i]._rect.y - y, 2)) : Math.abs(sList[i]._rect.x + (direction > 0 ? 0 : sList[i]._rect.width) - x);                    if (isDownList && deltaX >= lastDeltaX) {                        deltaX = lastDeltaX - 10;                    }                    if (!isDownList && deltaX <= lastDeltaX) {                        deltaX = lastDeltaX + 10;                    }                    sList[i]._rect.x = sList[i].style.x = x + deltaX * direction;                    if (sList[i]._labelLine) {                        sList[i]._labelLine.style.pointList[2][0] = x + (deltaX - 5) * direction;                        sList[i]._labelLine.style.pointList[1][0] = x + (deltaX - 20) * direction;                    }                    lastDeltaX = deltaX;                }            }            var lastY = 0;            var delta;            var len = tList.length;            var upList = [];            var downList = [];            for (var i = 0; i < len; i++) {                delta = tList[i]._rect.y - lastY;                if (delta < 0) {                    _changeDown(i, len, -delta, direction);                }                lastY = tList[i]._rect.y + tList[i]._rect.height;            }            if (this.zr.getHeight() - lastY < 0) {                _changeUp(len - 1, lastY - this.zr.getHeight());            }            for (var i = 0; i < len; i++) {                if (tList[i]._rect.y >= center[1]) {                    downList.push(tList[i]);                } else {                    upList.push(tList[i]);                }            }            _changeX(downList, true, center, r, direction);            _changeX(upList, false, center, r, direction);        },        reformOption: function (opt) {            var _merge = zrUtil.merge;            opt = _merge(_merge(opt || {}, zrUtil.clone(this.ecTheme.pie || {})), zrUtil.clone(ecConfig.pie));            opt.itemStyle.normal.label.textStyle = this.getTextStyle(opt.itemStyle.normal.label.textStyle);            opt.itemStyle.emphasis.label.textStyle = this.getTextStyle(opt.itemStyle.emphasis.label.textStyle);            this.z = opt.z;            this.zlevel = opt.zlevel;            return opt;        },        refresh: function (newOption) {            if (newOption) {                this.option = newOption;                this.series = newOption.series;            }            this.backupShapeList();            this._buildShape();        },        addDataAnimation: function (params, done) {            var series = this.series;            var aniMap = {};            for (var i = 0, l = params.length; i < l; i++) {                aniMap[params[i][0]] = params[i];            }            var aniCount = 0;            function animationDone() {                aniCount--;                if (aniCount === 0) {                    done && done();                }            }            var sectorMap = {};            var textMap = {};            var lineMap = {};            var backupShapeList = this.shapeList;            this.shapeList = [];            var seriesIndex;            var isHead;            var dataGrow;            var deltaIdxMap = {};            for (var i = 0, l = params.length; i < l; i++) {                seriesIndex = params[i][0];                isHead = params[i][2];                dataGrow = params[i][3];                if (series[seriesIndex] && series[seriesIndex].type === ecConfig.CHART_TYPE_PIE) {                    if (isHead) {                        if (!dataGrow) {                            sectorMap[seriesIndex + '_' + series[seriesIndex].data.length] = 'delete';                        }                        deltaIdxMap[seriesIndex] = 1;                    } else {                        if (!dataGrow) {                            sectorMap[seriesIndex + '_-1'] = 'delete';                            deltaIdxMap[seriesIndex] = -1;                        } else {                            deltaIdxMap[seriesIndex] = 0;                        }                    }                    this._buildSinglePie(seriesIndex);                }            }            var dataIndex;            var key;            for (var i = 0, l = this.shapeList.length; i < l; i++) {                seriesIndex = this.shapeList[i]._seriesIndex;                dataIndex = this.shapeList[i]._dataIndex;                key = seriesIndex + '_' + dataIndex;                switch (this.shapeList[i].type) {                case 'sector':                    sectorMap[key] = this.shapeList[i];                    break;                case 'text':                    textMap[key] = this.shapeList[i];                    break;                case 'polyline':                    lineMap[key] = this.shapeList[i];                    break;                }            }            this.shapeList = [];            var targeSector;            for (var i = 0, l = backupShapeList.length; i < l; i++) {                seriesIndex = backupShapeList[i]._seriesIndex;                if (aniMap[seriesIndex]) {                    dataIndex = backupShapeList[i]._dataIndex + deltaIdxMap[seriesIndex];                    key = seriesIndex + '_' + dataIndex;                    targeSector = sectorMap[key];                    if (!targeSector) {                        continue;                    }                    if (backupShapeList[i].type === 'sector') {                        if (targeSector != 'delete') {                            aniCount++;                            this.zr.animate(backupShapeList[i].id, 'style').when(400, {                                startAngle: targeSector.style.startAngle,                                endAngle: targeSector.style.endAngle                            }).done(animationDone).start();                        } else {                            aniCount++;                            this.zr.animate(backupShapeList[i].id, 'style').when(400, deltaIdxMap[seriesIndex] < 0 ? { startAngle: backupShapeList[i].style.startAngle } : { endAngle: backupShapeList[i].style.endAngle }).done(animationDone).start();                        }                    } else if (backupShapeList[i].type === 'text' || backupShapeList[i].type === 'polyline') {                        if (targeSector === 'delete') {                            this.zr.delShape(backupShapeList[i].id);                        } else {                            switch (backupShapeList[i].type) {                            case 'text':                                aniCount++;                                targeSector = textMap[key];                                this.zr.animate(backupShapeList[i].id, 'style').when(400, {                                    x: targeSector.style.x,                                    y: targeSector.style.y                                }).done(animationDone).start();                                break;                            case 'polyline':                                aniCount++;                                targeSector = lineMap[key];                                this.zr.animate(backupShapeList[i].id, 'style').when(400, { pointList: targeSector.style.pointList }).done(animationDone).start();                                break;                            }                        }                    }                }            }            this.shapeList = backupShapeList;            if (!aniCount) {                animationDone();            }        },        onclick: function (param) {            var series = this.series;            if (!this.isClick || !param.target) {                return;            }            this.isClick = false;            var offset;            var target = param.target;            var style = target.style;            var seriesIndex = ecData.get(target, 'seriesIndex');            var dataIndex = ecData.get(target, 'dataIndex');            for (var i = 0, len = this.shapeList.length; i < len; i++) {                if (this.shapeList[i].id === target.id) {                    seriesIndex = ecData.get(target, 'seriesIndex');                    dataIndex = ecData.get(target, 'dataIndex');                    if (!style._hasSelected) {                        var midAngle = ((style.startAngle + style.endAngle) / 2).toFixed(2) - 0;                        target.style._hasSelected = true;                        this._selected[seriesIndex][dataIndex] = true;                        target.style._x = target.style.x;                        target.style._y = target.style.y;                        offset = this.query(series[seriesIndex], 'selectedOffset');                        target.style.x += zrMath.cos(midAngle, true) * offset;                        target.style.y -= zrMath.sin(midAngle, true) * offset;                    } else {                        target.style.x = target.style._x;                        target.style.y = target.style._y;                        target.style._hasSelected = false;                        this._selected[seriesIndex][dataIndex] = false;                    }                    this.zr.modShape(target.id, target);                } else if (this.shapeList[i].style._hasSelected && this._selectedMode === 'single') {                    seriesIndex = ecData.get(this.shapeList[i], 'seriesIndex');                    dataIndex = ecData.get(this.shapeList[i], 'dataIndex');                    this.shapeList[i].style.x = this.shapeList[i].style._x;                    this.shapeList[i].style.y = this.shapeList[i].style._y;                    this.shapeList[i].style._hasSelected = false;                    this._selected[seriesIndex][dataIndex] = false;                    this.zr.modShape(this.shapeList[i].id, this.shapeList[i]);                }            }            this.messageCenter.dispatch(ecConfig.EVENT.PIE_SELECTED, param.event, {                selected: this._selected,                target: ecData.get(target, 'name')            }, this.myChart);            this.zr.refreshNextFrame();        }    };    zrUtil.inherits(Pie, ChartBase);    require('../chart').define('pie', Pie);    return Pie;});
 |