| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271 | 
/** Licensed to the Apache Software Foundation (ASF) under one* or more contributor license agreements.  See the NOTICE file* distributed with this work for additional information* regarding copyright ownership.  The ASF licenses this file* to you under the Apache License, Version 2.0 (the* "License"); you may not use this file except in compliance* with the License.  You may obtain a copy of the License at**   http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing,* software distributed under the License is distributed on an* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY* KIND, either express or implied.  See the License for the* specific language governing permissions and limitations* under the License.*/var graphic = require("../../util/graphic");var ChartView = require("../../view/Chart");/** Licensed to the Apache Software Foundation (ASF) under one* or more contributor license agreements.  See the NOTICE file* distributed with this work for additional information* regarding copyright ownership.  The ASF licenses this file* to you under the Apache License, Version 2.0 (the* "License"); you may not use this file except in compliance* with the License.  You may obtain a copy of the License at**   http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing,* software distributed under the License is distributed on an* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY* KIND, either express or implied.  See the License for the* specific language governing permissions and limitations* under the License.*/var DEFAULT_SMOOTH = 0.3;var ParallelView = ChartView.extend({  type: 'parallel',  init: function () {    /**     * @type {module:zrender/container/Group}     * @private     */    this._dataGroup = new graphic.Group();    this.group.add(this._dataGroup);    /**     * @type {module:echarts/data/List}     */    this._data;    /**     * @type {boolean}     */    this._initialized;  },  /**   * @override   */  render: function (seriesModel, ecModel, api, payload) {    var dataGroup = this._dataGroup;    var data = seriesModel.getData();    var oldData = this._data;    var coordSys = seriesModel.coordinateSystem;    var dimensions = coordSys.dimensions;    var seriesScope = makeSeriesScope(seriesModel);    data.diff(oldData).add(add).update(update).remove(remove).execute();    function add(newDataIndex) {      var line = addEl(data, dataGroup, newDataIndex, dimensions, coordSys);      updateElCommon(line, data, newDataIndex, seriesScope);    }    function update(newDataIndex, oldDataIndex) {      var line = oldData.getItemGraphicEl(oldDataIndex);      var points = createLinePoints(data, newDataIndex, dimensions, coordSys);      data.setItemGraphicEl(newDataIndex, line);      var animationModel = payload && payload.animation === false ? null : seriesModel;      graphic.updateProps(line, {        shape: {          points: points        }      }, animationModel, newDataIndex);      updateElCommon(line, data, newDataIndex, seriesScope);    }    function remove(oldDataIndex) {      var line = oldData.getItemGraphicEl(oldDataIndex);      dataGroup.remove(line);    } // First create    if (!this._initialized) {      this._initialized = true;      var clipPath = createGridClipShape(coordSys, seriesModel, function () {        // Callback will be invoked immediately if there is no animation        setTimeout(function () {          dataGroup.removeClipPath();        });      });      dataGroup.setClipPath(clipPath);    }    this._data = data;  },  incrementalPrepareRender: function (seriesModel, ecModel, api) {    this._initialized = true;    this._data = null;    this._dataGroup.removeAll();  },  incrementalRender: function (taskParams, seriesModel, ecModel) {    var data = seriesModel.getData();    var coordSys = seriesModel.coordinateSystem;    var dimensions = coordSys.dimensions;    var seriesScope = makeSeriesScope(seriesModel);    for (var dataIndex = taskParams.start; dataIndex < taskParams.end; dataIndex++) {      var line = addEl(data, this._dataGroup, dataIndex, dimensions, coordSys);      line.incremental = true;      updateElCommon(line, data, dataIndex, seriesScope);    }  },  dispose: function () {},  // _renderForProgressive: function (seriesModel) {  //     var dataGroup = this._dataGroup;  //     var data = seriesModel.getData();  //     var oldData = this._data;  //     var coordSys = seriesModel.coordinateSystem;  //     var dimensions = coordSys.dimensions;  //     var option = seriesModel.option;  //     var progressive = option.progressive;  //     var smooth = option.smooth ? SMOOTH : null;  //     // In progressive animation is disabled, so use simple data diff,  //     // which effects performance less.  //     // (Typically performance for data with length 7000+ like:  //     // simpleDiff: 60ms, addEl: 184ms,  //     // in RMBP 2.4GHz intel i7, OSX 10.9 chrome 50.0.2661.102 (64-bit))  //     if (simpleDiff(oldData, data, dimensions)) {  //         dataGroup.removeAll();  //         data.each(function (dataIndex) {  //             addEl(data, dataGroup, dataIndex, dimensions, coordSys);  //         });  //     }  //     updateElCommon(data, progressive, smooth);  //     // Consider switch between progressive and not.  //     data.__plProgressive = true;  //     this._data = data;  // },  /**   * @override   */  remove: function () {    this._dataGroup && this._dataGroup.removeAll();    this._data = null;  }});function createGridClipShape(coordSys, seriesModel, cb) {  var parallelModel = coordSys.model;  var rect = coordSys.getRect();  var rectEl = new graphic.Rect({    shape: {      x: rect.x,      y: rect.y,      width: rect.width,      height: rect.height    }  });  var dim = parallelModel.get('layout') === 'horizontal' ? 'width' : 'height';  rectEl.setShape(dim, 0);  graphic.initProps(rectEl, {    shape: {      width: rect.width,      height: rect.height    }  }, seriesModel, cb);  return rectEl;}function createLinePoints(data, dataIndex, dimensions, coordSys) {  var points = [];  for (var i = 0; i < dimensions.length; i++) {    var dimName = dimensions[i];    var value = data.get(data.mapDimension(dimName), dataIndex);    if (!isEmptyValue(value, coordSys.getAxis(dimName).type)) {      points.push(coordSys.dataToPoint(value, dimName));    }  }  return points;}function addEl(data, dataGroup, dataIndex, dimensions, coordSys) {  var points = createLinePoints(data, dataIndex, dimensions, coordSys);  var line = new graphic.Polyline({    shape: {      points: points    },    silent: true,    z2: 10  });  dataGroup.add(line);  data.setItemGraphicEl(dataIndex, line);  return line;}function makeSeriesScope(seriesModel) {  var smooth = seriesModel.get('smooth', true);  smooth === true && (smooth = DEFAULT_SMOOTH);  return {    lineStyle: seriesModel.getModel('lineStyle').getLineStyle(),    smooth: smooth != null ? smooth : DEFAULT_SMOOTH  };}function updateElCommon(el, data, dataIndex, seriesScope) {  var lineStyle = seriesScope.lineStyle;  if (data.hasItemOption) {    var lineStyleModel = data.getItemModel(dataIndex).getModel('lineStyle');    lineStyle = lineStyleModel.getLineStyle();  }  el.useStyle(lineStyle);  var elStyle = el.style;  elStyle.fill = null; // lineStyle.color have been set to itemVisual in module:echarts/visual/seriesColor.  elStyle.stroke = data.getItemVisual(dataIndex, 'color'); // lineStyle.opacity have been set to itemVisual in parallelVisual.  elStyle.opacity = data.getItemVisual(dataIndex, 'opacity');  seriesScope.smooth && (el.shape.smooth = seriesScope.smooth);} // function simpleDiff(oldData, newData, dimensions) {//     var oldLen;//     if (!oldData//         || !oldData.__plProgressive//         || (oldLen = oldData.count()) !== newData.count()//     ) {//         return true;//     }//     var dimLen = dimensions.length;//     for (var i = 0; i < oldLen; i++) {//         for (var j = 0; j < dimLen; j++) {//             if (oldData.get(dimensions[j], i) !== newData.get(dimensions[j], i)) {//                 return true;//             }//         }//     }//     return false;// }// FIXME// 公用方法?function isEmptyValue(val, axisType) {  return axisType === 'category' ? val == null : val == null || isNaN(val); // axisType === 'value'}var _default = ParallelView;module.exports = _default;
 |