var markLineTransform = function (seriesModel, coordSys, mlModel, item) {
        var data = seriesModel.getData();
        // Special type markLine like 'min', 'max', 'average'
        var mlType = item.type;

        if (!zrUtil.isArray(item)
            && (mlType === 'min' || mlType === 'max' || mlType === 'average')
        ) {
            var axisInfo = markerHelper.getAxisInfo(item, data, coordSys, seriesModel);

            var baseAxisKey = axisInfo.baseAxis.dim + 'Axis';
            var valueAxisKey = axisInfo.valueAxis.dim + 'Axis';
            var baseScaleExtent = axisInfo.baseAxis.scale.getExtent();

            var mlFrom = zrUtil.clone(item);
            var mlTo = {};

            mlFrom.type = null;

            // FIXME Polar should use circle
            mlFrom[baseAxisKey] = baseScaleExtent[0];
            mlTo[baseAxisKey] = baseScaleExtent[1];

            var value = markerHelper.numCalculate(data, axisInfo.valueDataDim, mlType);

            // Round if axis is cateogry
            value = axisInfo.valueAxis.coordToData(axisInfo.valueAxis.dataToCoord(value));

            var precision = mlModel.get('precision');
            if (precision >= 0) {
                value = +value.toFixed(precision);
            }

            mlFrom[valueAxisKey] = mlTo[valueAxisKey] = value;

            item = [mlFrom, mlTo, { // Extra option for tooltip and label
                type: mlType,
                valueIndex: item.valueIndex,
                // Force to use the value of calculated value.
                value: value
            }];
        }

        item = [
            markerHelper.dataTransform(seriesModel, item[0]),
            markerHelper.dataTransform(seriesModel, item[1]),
            zrUtil.extend({}, item[2])
        ];

        // Avoid line data type is extended by from(to) data type
        item[2].type = item[2].type || '';

        // Merge from option and to option into line option
        zrUtil.merge(item[2], item[0]);
        zrUtil.merge(item[2], item[1]);

        return item;
    };
示例#2
0
文件: Series.js 项目: libran7/echarts
        mergeDefaultAndTheme: function (option, ecModel) {
            zrUtil.merge(
                option,
                ecModel.getTheme().get(this.subType)
            );
            zrUtil.merge(option, this.getDefaultOption());

            // Default label emphasis `position` and `show`
            modelUtil.defaultEmphasis(
                option.label, ['position', 'show', 'textStyle', 'distance', 'formatter']
            );
        },
示例#3
0
        mergeDefaultAndTheme: function (option, ecModel) {
            zrUtil.merge(
                option,
                ecModel.getTheme().get(this.subType)
            );
            zrUtil.merge(option, this.getDefaultOption());

            // Default label emphasis `position` and `show`
            // FIXME Set label in mergeOption
            modelUtil.defaultEmphasis(option.label, modelUtil.LABEL_OPTIONS);

            this.fillDataTextStyle(option.data);
        },
示例#4
0
        mergeDefaultAndTheme: function (option, ecModel) {
            var layoutMode = this.layoutMode;
            var inputPositionParams = layoutMode
                ? layout.getLayoutParams(option) : {};

            var themeModel = ecModel.getTheme();
            zrUtil.merge(option, themeModel.get(this.mainType));
            zrUtil.merge(option, this.getDefaultOption());

            if (layoutMode) {
                layout.mergeLayoutParam(option, inputPositionParams, layoutMode);
            }
        },
示例#5
0
    var markLineTransform = function (seriesModel, coordSys, baseAxis, valueAxis, precision, item) {
        var data = seriesModel.getData();
        // Special type markLine like 'min', 'max', 'average'
        var mlType = item.type;
        if (!zrUtil.isArray(item)
            && mlType === 'min' || mlType === 'max' || mlType === 'average'
        ) {
            if (item.valueIndex != null) {
                baseAxis = coordSys.getAxis(coordSys.dimensions[1 - item.valueIndex]);
                valueAxis = coordSys.getAxis(coordSys.dimensions[item.valueIndex]);
            }
            var baseAxisKey = baseAxis.dim + 'Axis';
            var valueAxisKey = valueAxis.dim + 'Axis';
            var baseScaleExtent = baseAxis.scale.getExtent();

            var mlFrom = zrUtil.extend({}, item);
            var mlTo = {};

            mlFrom.type = null;

            // FIXME Polar should use circle
            mlFrom[baseAxisKey] = baseScaleExtent[0];
            mlTo[baseAxisKey] = baseScaleExtent[1];

            var value = mlType === 'average'
                ? data.getSum(valueAxis.dim, true) / data.count()
                : data.getDataExtent(valueAxis.dim)[mlType === 'max' ? 1 : 0];

            // Round if axis is cateogry
            value = valueAxis.coordToData(valueAxis.dataToCoord(value));

            mlFrom[valueAxisKey] = mlTo[valueAxisKey] = value;

            item = [mlFrom, mlTo, { // Extra option for tooltip and label
                type: mlType,
                // Force to use the value of calculated value.
                value: +value.toFixed(precision)
            }];
        }
        item = [
            markerHelper.dataTransform(seriesModel, item[0]),
            markerHelper.dataTransform(seriesModel, item[1]),
            zrUtil.extend({}, item[2])
        ];

        // Merge from option and to option into line option
        zrUtil.merge(item[2], item[0]);
        zrUtil.merge(item[2], item[1]);

        return item;
    };
示例#6
0
    /**
     * Create symbol or update symbol
     */
    function giveSymbol(hostModel, itemStyleModel, group, opt, symbol, callback) {
        var symbolType = hostModel.get('symbol');
        var color = itemStyleModel.get('color');
        var symbolSize = hostModel.get('symbolSize');
        var halfSymbolSize = symbolSize / 2;
        var itemStyle = itemStyleModel.getItemStyle(['color', 'symbol', 'symbolSize']);

        if (!symbol) {
            symbol = symbolUtil.createSymbol(
                symbolType, -halfSymbolSize, -halfSymbolSize, symbolSize, symbolSize, color
            );
            group.add(symbol);
            callback && callback.onCreate(symbol);
        }
        else {
            symbol.setStyle(itemStyle);
            symbol.setColor(color);
            group.add(symbol); // Group may be new, also need to add.
            callback && callback.onUpdate(symbol);
        }

        opt = zrUtil.merge({
            rectHover: true,
            style: itemStyle,
            z2: 100
        }, opt, true);

        symbol.attr(opt);

        return symbol;
    }
示例#7
0
    function initBase(baseOption) {
        baseOption = baseOption;

        this.option = {};

        /**
         * @type {Object.<string, Array.<module:echarts/model/Model>>}
         * @private
         */
        this._componentsMap = {};

        /**
         * Mapping between filtered series list and raw series list.
         * key: filtered series indices, value: raw series indices.
         * @type {Array.<nubmer>}
         * @private
         */
        this._seriesIndices = null;

        mergeTheme(baseOption, this._theme.option);

        // TODO Needs clone when merging to the unexisted property
        zrUtil.merge(baseOption, globalDefault, false);

        this.mergeOption(baseOption);
    }
示例#8
0
        mergeOption: function (newOption) {
            var thisOption = this.option;

            newOption && zrUtil.merge(thisOption, newOption, true);

            this._initDimensions();
        },
示例#9
0
    function initBase(baseOption) {
        baseOption = baseOption;

        // Using OPTION_INNER_KEY to mark that this option can not be used outside,
        // i.e. `chart.setOption(chart.getModel().option);` is forbiden.
        this.option = {};
        this.option[OPTION_INNER_KEY] = 1;

        /**
         * @type {Object.<string, Array.<module:echarts/model/Model>>}
         * @private
         */
        this._componentsMap = {};

        /**
         * Mapping between filtered series list and raw series list.
         * key: filtered series indices, value: raw series indices.
         * @type {Array.<nubmer>}
         * @private
         */
        this._seriesIndices = null;

        mergeTheme(baseOption, this._theme.option);

        // TODO Needs clone when merging to the unexisted property
        zrUtil.merge(baseOption, globalDefault, false);

        this.mergeOption(baseOption);
    }
示例#10
0
 'tiled': function (seriesType, seriesId, seriesModel, model) {
     if (seriesType === 'line' || seriesType === 'bar') {
         return zrUtil.merge({
             id: seriesId,
             stack: ''
         }, model.get('option.tiled') || {}, true);
     }
 }
示例#11
0
 'stack': function (seriesType, seriesId, seriesModel, model) {
     if (seriesType === 'line' || seriesType === 'bar') {
         return zrUtil.merge({
             id: seriesId,
             stack: '__ec_magicType_stack__'
         }, model.get('option.stack') || {}, true);
     }
 },
示例#12
0
        mergeOption: function (newOption) {
            var rawOption = retrieveRaw(newOption);

            //FIX #2591
            zrUtil.merge(this.option, newOption, true);

            this.doInit(rawOption);
        },
示例#13
0
        mergeOption: function (option, extraOpt) {
            zrUtil.merge(this.option, option, true);

            var layoutMode = this.layoutMode;
            if (layoutMode) {
                layout.mergeLayoutParam(this.option, option, layoutMode);
            }
        },
示例#14
0
        _renderYearText: function (calendarModel, rangeData, orient, group) {
            var yearLabel = calendarModel.getModel('yearLabel');

            if (!yearLabel.get('show')) {
                return;
            }

            var yearLabelStyleModel = calendarModel.getModel('yearLabel.textStyle');
            var margin = yearLabel.get('margin');
            var pos = yearLabel.get('position');

            if (!pos) {
                pos = orient !== 'horizontal' ? 'top' : 'left';
            }

            var points = [this._tlpoints[this._tlpoints.length - 1], this._blpoints[0]];
            var xc = (points[0][0] + points[1][0]) / 2;
            var yc = (points[0][1] + points[1][1]) / 2;

            var idx = orient === 'horizontal' ? 0 : 1;


            var posPoints = {
                top: [xc, points[idx][1]],
                bottom: [xc, points[1 - idx][1]],
                left: [points[1 - idx][0], yc],
                right: [points[idx][0], yc]
            };

            var name = rangeData.start.y;

            if (+rangeData.end.y > +rangeData.start.y) {
                name = name + '-' + rangeData.end.y;
            }

            var formatter = yearLabel.get('formatter');

            var params = {
                start: rangeData.start.y,
                end: rangeData.end.y,
                nameMap: name
            };

            var content = this._formatterLabel(formatter, params);

            var yearText = new graphic.Text(
                zrUtil.merge({
                    z2: 30,
                    style: {
                        text: content,
                        font: yearLabelStyleModel.getFont(),
                        fill: yearLabelStyleModel.getTextColor()
                    }
                }, this._yearTextPositionControl(posPoints[pos], orient, pos, margin))
            );

            group.add(yearText);
        },
示例#15
0
    /**
     * Create symbol or update symbol
     * opt: basic position and event handlers
     */
    function giveSymbol(hostModel, itemStyleModel, group, opt, symbol, callback) {
        var color = itemStyleModel.get('color');

        if (!symbol) {
            var symbolType = hostModel.get('symbol');
            symbol = symbolUtil.createSymbol(symbolType, -1, -1, 2, 2, color);
            symbol.setStyle('strokeNoScale', true);
            group.add(symbol);
            callback && callback.onCreate(symbol);
        }
        else {
            symbol.setColor(color);
            group.add(symbol); // Group may be new, also need to add.
            callback && callback.onUpdate(symbol);
        }

        // Style
        var itemStyle = itemStyleModel.getItemStyle(['color', 'symbol', 'symbolSize']);
        symbol.setStyle(itemStyle);

        // Transform and events.
        opt = zrUtil.merge({
            rectHover: true,
            z2: 100
        }, opt, true);

        var symbolSize = hostModel.get('symbolSize');
        symbolSize = symbolSize instanceof Array
            ? symbolSize.slice()
            : [+symbolSize, +symbolSize];
        symbolSize[0] /= 2;
        symbolSize[1] /= 2;
        opt.scale = symbolSize;

        var symbolOffset = hostModel.get('symbolOffset');
        if (symbolOffset) {
            var pos = opt.position = opt.position || [0, 0];
            pos[0] += numberUtil.parsePercent(symbolOffset[0], symbolSize[0]);
            pos[1] += numberUtil.parsePercent(symbolOffset[1], symbolSize[1]);
        }

        var symbolRotate = hostModel.get('symbolRotate');
        opt.rotation = (symbolRotate || 0) * Math.PI / 180 || 0;

        symbol.attr(opt);

        // FIXME
        // (1) When symbol.style.strokeNoScale is true and updateTransform is not performed,
        // getBoundingRect will return wrong result.
        // (This is supposed to be resolved in zrender, but it is a little difficult to
        // leverage performance and auto updateTransform)
        // (2) All of ancesters of symbol do not scale, so we can just updateTransform symbol.
        symbol.updateTransform();

        return symbol;
    }
示例#16
0
        mergeOption: function (newSeriesOption, ecModel) {
            newSeriesOption = zrUtil.merge(this.option, newSeriesOption, true);

            var data = this.getInitialData(newSeriesOption, ecModel);
            // TODO Merge data?
            if (data) {
                this._data = data;
                this._dataBeforeProcessed = data.cloneShallow();
            }
        },
示例#17
0
 'bar': function (seriesType, seriesId, seriesModel, model) {
     if (seriesType === 'line') {
         return zrUtil.merge({
             id: seriesId,
             type: 'bar',
             // Preserve data related option
             data: seriesModel.get('data'),
             stack: seriesModel.get('stack')
         }, model.get('option.bar'));
     }
 },
示例#18
0
        zrUtil.each(axes, function (axisOption) {
            if (!zrUtil.isObject(axisOption)) {
                return;
            }

            var parallelIndex = axisOption.parallelIndex || 0;
            var parallelOption = modelUtil.normalizeToArray(option.parallel)[parallelIndex];

            if (parallelOption && parallelOption.parallelAxisDefault) {
                zrUtil.merge(axisOption, parallelOption.parallelAxisDefault, false);
            }
        });
示例#19
0
        mergeDefaultAndTheme: function (option, ecModel) {
            var layoutMode = this.layoutMode;
            var inputPositionParams = layoutMode
                ? layout.getLayoutParams(option) : {};

            zrUtil.merge(
                option,
                ecModel.getTheme().get(this.subType)
            );
            zrUtil.merge(option, this.getDefaultOption());

            // Default label emphasis `position` and `show`
            // FIXME Set label in mergeOption
            modelUtil.defaultEmphasis(option.label, modelUtil.LABEL_OPTIONS);

            this.fillDataTextStyle(option.data);

            if (layoutMode) {
                layout.mergeLayoutParam(option, inputPositionParams, layoutMode);
            }
        },
示例#20
0
 _mergeBrushOption: function (brushOption) {
     var option = this.option;
     return zrUtil.merge(
         {
             brushType: option.brushType,
             brushMode: option.brushMode,
             transformable: option.transformable,
             brushStyle: option.brushStyle
         },
         brushOption,
         true
     );
 }
示例#21
0
    function doEnableBrush(controller, brushOption) {
        var zr = controller._zr;

        // Consider roam, which takes globalCursor too.
        interactionMutex.take(zr, MUTEX_RESOURCE_KEY, controller._uid);

        each(controller._handlers, function (handler, eventName) {
            zr.on(eventName, handler);
        });

        controller._brushType = brushOption.brushType;
        controller._brushOption = zrUtil.merge(zrUtil.clone(DEFAULT_BRUSH_OPT), brushOption, true);
    }
示例#22
0
 'line': function (seriesType, seriesId, seriesModel, model) {
     if (seriesType === 'bar') {
         return zrUtil.merge({
             id: seriesId,
             type: 'line',
             // Preserve data related option
             data: seriesModel.get('data'),
             stack: seriesModel.get('stack'),
             markPoint: seriesModel.get('markPoint'),
             markLine: seriesModel.get('markLine')
         }, model.get('option.line') || {}, true);
     }
 },
示例#23
0
 function generateBrushOption(option, brushOption) {
     return zrUtil.merge(
         {
             brushType: option.brushType,
             brushMode: option.brushMode,
             transformable: option.transformable,
             brushStyle: new Model(option.brushStyle).getItemStyle(),
             removeOnClick: option.removeOnClick
         },
         brushOption,
         true
     );
 }
示例#24
0
            var indicatorModels = zrUtil.map(this.get('indicator') || [], function (indicatorOpt) {
                // PENDING
                if (indicatorOpt.max != null && indicatorOpt.max > 0 && !indicatorOpt.min) {
                    indicatorOpt.min = 0;
                }
                else if (indicatorOpt.min != null && indicatorOpt.min < 0 && !indicatorOpt.max) {
                    indicatorOpt.max = 0;
                }
                var iNameTextStyle = nameTextStyle;
                if(indicatorOpt.color != null) {
                    iNameTextStyle = zrUtil.defaults({color: indicatorOpt.color}, nameTextStyle);
                }
                // Use same configuration
                indicatorOpt = zrUtil.merge(zrUtil.clone(indicatorOpt), {
                    boundaryGap: boundaryGap,
                    splitNumber: splitNumber,
                    scale: scale,
                    axisLine: axisLine,
                    axisTick: axisTick,
                    axisLabel: axisLabel,
                    // Competitable with 2 and use text
                    name: indicatorOpt.text,
                    nameLocation: 'end',
                    nameGap: nameGap,
                    // min: 0,
                    nameTextStyle: iNameTextStyle,
                    triggerEvent: triggerEvent
                }, false);
                if (!showName) {
                    indicatorOpt.name = '';
                }
                if (typeof nameFormatter === 'string') {
                    var indName = indicatorOpt.name;
                    indicatorOpt.name = nameFormatter.replace('{value}', indName != null ? indName : '');
                }
                else if (typeof nameFormatter === 'function') {
                    indicatorOpt.name = nameFormatter(
                        indicatorOpt.name, indicatorOpt
                    );
                }
                var model = zrUtil.extend(
                    new Model(indicatorOpt, null, this.ecModel),
                    axisModelCommonMixin
                );

                // For triggerEvent.
                model.mainType = 'radar';
                model.componentIndex = this.componentIndex;

                return model;
            }, this);
示例#25
0
 _mergeBrushOption: function (brushOption) {
     var option = this.option;
     return zrUtil.merge(
         {
             brushType: option.brushType,
             brushMode: option.brushMode,
             transformable: option.transformable,
             brushStyle: new Model(option.brushStyle).getItemStyle(),
             removeOnClick: option.removeOnClick
         },
         brushOption,
         true
     );
 }
示例#26
0
        mergeDefaultAndTheme: function (option, ecModel) {
            zrUtil.merge(
                option,
                ecModel.getTheme().get(this.subType)
            );
            zrUtil.merge(option, this.getDefaultOption());

            // Default label emphasis `position` and `show`
            modelUtil.defaultEmphasis(
                option.label, ['position', 'show', 'textStyle', 'distance', 'formatter']
            );

            // Default data label emphasis `position` and `show`
            // FIXME Tree structure data ?
            var data = option.data || [];
            for (var i = 0; i < data.length; i++) {
                if (data[i] && data[i].label) {
                    modelUtil.defaultEmphasis(
                        data[i].label, ['position', 'show', 'textStyle', 'distance', 'formatter']
                    );
                }
            }
        },
示例#27
0
define(function(require) {

    'use strict';

    var zrUtil = require('zrender/core/util');
    var ComponentModel = require('../../model/Component');
    var axisModelCreator = require('../axisModelCreator');

    var PolarAxisModel = ComponentModel.extend({
        type: 'polarAxis',
        /**
         * @type {module:echarts/coord/polar/AngleAxis|module:echarts/coord/polar/RadiusAxis}
         */
        axis: null
    });

    zrUtil.merge(PolarAxisModel.prototype, require('../axisModelCommonMixin'));

    var polarAxisDefaultExtendedOption = {
        angle: {
            // polarIndex: 0,
            // polarId: '',

            startAngle: 90,

            clockwise: true,

            splitNumber: 12,

            axisLabel: {
                rotate: false
            }
        },
        radius: {
            // polarIndex: 0,
            // polarId: '',

            splitNumber: 5
        }
    };

    function getAxisType(axisDim, option) {
        // Default axis with data is category axis
        return option.type || (option.data ? 'category' : 'value');
    }

    axisModelCreator('angle', PolarAxisModel, getAxisType, polarAxisDefaultExtendedOption.angle);
    axisModelCreator('radius', PolarAxisModel, getAxisType, polarAxisDefaultExtendedOption.radius);

});
示例#28
0
            each(newOption, function (componentOption, mainType) {
                if (componentOption == null) {
                    return;
                }

                if (!ComponentModel.hasClass(mainType)) {
                    option[mainType] = option[mainType] == null
                        ? zrUtil.clone(componentOption)
                        : zrUtil.merge(option[mainType], componentOption, true);
                }
                else {
                    newCptTypes.push(mainType);
                }
            });
示例#29
0
 /**
  * @inner
  */
 function mergeTheme(option, theme) {
     for (var name in theme) {
         // 如果有 component model 则把具体的 merge 逻辑交给该 model 处理
         if (!ComponentModel.hasClass(name)) {
             if (typeof theme[name] === 'object') {
                 option[name] = !option[name]
                     ? zrUtil.clone(theme[name])
                     : zrUtil.merge(option[name], theme[name], false);
             }
             else {
                 option[name] = theme[name];
             }
         }
     }
 }
示例#30
0
文件: Series.js 项目: libran7/echarts
        mergeOption: function (newSeriesOption, ecModel) {
            newSeriesOption = zrUtil.merge(this.option, newSeriesOption, true);

            var data = this.getInitialData(newSeriesOption, ecModel);
            // TODO Merge data?
            if (data) {
                this._data = data;
                this._dataBeforeProcessed = data.cloneShallow();
            }
            // FIXME
            // Default label emphasis `position` and `show`
            // Do it after option is merged. In case newSeriesOption only
            // set the value in emphasis
            // modelUtil.defaultNormalEmphasis(this.option.label);
        },