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; };
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'] ); },
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); },
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); } },
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; };
/** * 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; }
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); }
mergeOption: function (newOption) { var thisOption = this.option; newOption && zrUtil.merge(thisOption, newOption, true); this._initDimensions(); },
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); }
'tiled': function (seriesType, seriesId, seriesModel, model) { if (seriesType === 'line' || seriesType === 'bar') { return zrUtil.merge({ id: seriesId, stack: '' }, model.get('option.tiled') || {}, true); } }
'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); } },
mergeOption: function (newOption) { var rawOption = retrieveRaw(newOption); //FIX #2591 zrUtil.merge(this.option, newOption, true); this.doInit(rawOption); },
mergeOption: function (option, extraOpt) { zrUtil.merge(this.option, option, true); var layoutMode = this.layoutMode; if (layoutMode) { layout.mergeLayoutParam(this.option, option, layoutMode); } },
_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); },
/** * 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; }
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(); } },
'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')); } },
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); } });
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); } },
_mergeBrushOption: function (brushOption) { var option = this.option; return zrUtil.merge( { brushType: option.brushType, brushMode: option.brushMode, transformable: option.transformable, brushStyle: option.brushStyle }, brushOption, true ); }
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); }
'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); } },
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 ); }
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);
_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 ); }
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'] ); } } },
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); });
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); } });
/** * @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]; } } } }
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); },