| 
/* 
 | 
* 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. 
 | 
*/ 
 | 
  
 | 
  
 | 
/** 
 | 
 * AUTO-GENERATED FILE. DO NOT MODIFY. 
 | 
 */ 
 | 
  
 | 
/* 
 | 
* 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. 
 | 
*/ 
 | 
import { __extends } from "tslib"; 
 | 
import * as zrUtil from 'zrender/lib/core/util.js'; 
 | 
import * as graphic from '../../util/graphic.js'; 
 | 
import { createTextStyle } from '../../label/labelStyle.js'; 
 | 
import Model from '../../model/Model.js'; 
 | 
import AxisView from './AxisView.js'; 
 | 
import AxisBuilder from './AxisBuilder.js'; 
 | 
import { getECData } from '../../util/innerStore.js'; 
 | 
var elementList = ['axisLine', 'axisLabel', 'axisTick', 'minorTick', 'splitLine', 'minorSplitLine', 'splitArea']; 
 | 
function getAxisLineShape(polar, rExtent, angle) { 
 | 
  rExtent[1] > rExtent[0] && (rExtent = rExtent.slice().reverse()); 
 | 
  var start = polar.coordToPoint([rExtent[0], angle]); 
 | 
  var end = polar.coordToPoint([rExtent[1], angle]); 
 | 
  return { 
 | 
    x1: start[0], 
 | 
    y1: start[1], 
 | 
    x2: end[0], 
 | 
    y2: end[1] 
 | 
  }; 
 | 
} 
 | 
function getRadiusIdx(polar) { 
 | 
  var radiusAxis = polar.getRadiusAxis(); 
 | 
  return radiusAxis.inverse ? 0 : 1; 
 | 
} 
 | 
// Remove the last tick which will overlap the first tick 
 | 
function fixAngleOverlap(list) { 
 | 
  var firstItem = list[0]; 
 | 
  var lastItem = list[list.length - 1]; 
 | 
  if (firstItem && lastItem && Math.abs(Math.abs(firstItem.coord - lastItem.coord) - 360) < 1e-4) { 
 | 
    list.pop(); 
 | 
  } 
 | 
} 
 | 
var AngleAxisView = /** @class */function (_super) { 
 | 
  __extends(AngleAxisView, _super); 
 | 
  function AngleAxisView() { 
 | 
    var _this = _super !== null && _super.apply(this, arguments) || this; 
 | 
    _this.type = AngleAxisView.type; 
 | 
    _this.axisPointerClass = 'PolarAxisPointer'; 
 | 
    return _this; 
 | 
  } 
 | 
  AngleAxisView.prototype.render = function (angleAxisModel, ecModel) { 
 | 
    this.group.removeAll(); 
 | 
    if (!angleAxisModel.get('show')) { 
 | 
      return; 
 | 
    } 
 | 
    var angleAxis = angleAxisModel.axis; 
 | 
    var polar = angleAxis.polar; 
 | 
    var radiusExtent = polar.getRadiusAxis().getExtent(); 
 | 
    var ticksAngles = angleAxis.getTicksCoords(); 
 | 
    var minorTickAngles = angleAxis.getMinorTicksCoords(); 
 | 
    var labels = zrUtil.map(angleAxis.getViewLabels(), function (labelItem) { 
 | 
      labelItem = zrUtil.clone(labelItem); 
 | 
      var scale = angleAxis.scale; 
 | 
      var tickValue = scale.type === 'ordinal' ? scale.getRawOrdinalNumber(labelItem.tickValue) : labelItem.tickValue; 
 | 
      labelItem.coord = angleAxis.dataToCoord(tickValue); 
 | 
      return labelItem; 
 | 
    }); 
 | 
    fixAngleOverlap(labels); 
 | 
    fixAngleOverlap(ticksAngles); 
 | 
    zrUtil.each(elementList, function (name) { 
 | 
      if (angleAxisModel.get([name, 'show']) && (!angleAxis.scale.isBlank() || name === 'axisLine')) { 
 | 
        angelAxisElementsBuilders[name](this.group, angleAxisModel, polar, ticksAngles, minorTickAngles, radiusExtent, labels); 
 | 
      } 
 | 
    }, this); 
 | 
  }; 
 | 
  AngleAxisView.type = 'angleAxis'; 
 | 
  return AngleAxisView; 
 | 
}(AxisView); 
 | 
var angelAxisElementsBuilders = { 
 | 
  axisLine: function (group, angleAxisModel, polar, ticksAngles, minorTickAngles, radiusExtent) { 
 | 
    var lineStyleModel = angleAxisModel.getModel(['axisLine', 'lineStyle']); 
 | 
    var angleAxis = polar.getAngleAxis(); 
 | 
    var RADIAN = Math.PI / 180; 
 | 
    var angleExtent = angleAxis.getExtent(); 
 | 
    // extent id of the axis radius (r0 and r) 
 | 
    var rId = getRadiusIdx(polar); 
 | 
    var r0Id = rId ? 0 : 1; 
 | 
    var shape; 
 | 
    var shapeType = Math.abs(angleExtent[1] - angleExtent[0]) === 360 ? 'Circle' : 'Arc'; 
 | 
    if (radiusExtent[r0Id] === 0) { 
 | 
      shape = new graphic[shapeType]({ 
 | 
        shape: { 
 | 
          cx: polar.cx, 
 | 
          cy: polar.cy, 
 | 
          r: radiusExtent[rId], 
 | 
          startAngle: -angleExtent[0] * RADIAN, 
 | 
          endAngle: -angleExtent[1] * RADIAN, 
 | 
          clockwise: angleAxis.inverse 
 | 
        }, 
 | 
        style: lineStyleModel.getLineStyle(), 
 | 
        z2: 1, 
 | 
        silent: true 
 | 
      }); 
 | 
    } else { 
 | 
      shape = new graphic.Ring({ 
 | 
        shape: { 
 | 
          cx: polar.cx, 
 | 
          cy: polar.cy, 
 | 
          r: radiusExtent[rId], 
 | 
          r0: radiusExtent[r0Id] 
 | 
        }, 
 | 
        style: lineStyleModel.getLineStyle(), 
 | 
        z2: 1, 
 | 
        silent: true 
 | 
      }); 
 | 
    } 
 | 
    shape.style.fill = null; 
 | 
    group.add(shape); 
 | 
  }, 
 | 
  axisTick: function (group, angleAxisModel, polar, ticksAngles, minorTickAngles, radiusExtent) { 
 | 
    var tickModel = angleAxisModel.getModel('axisTick'); 
 | 
    var tickLen = (tickModel.get('inside') ? -1 : 1) * tickModel.get('length'); 
 | 
    var radius = radiusExtent[getRadiusIdx(polar)]; 
 | 
    var lines = zrUtil.map(ticksAngles, function (tickAngleItem) { 
 | 
      return new graphic.Line({ 
 | 
        shape: getAxisLineShape(polar, [radius, radius + tickLen], tickAngleItem.coord) 
 | 
      }); 
 | 
    }); 
 | 
    group.add(graphic.mergePath(lines, { 
 | 
      style: zrUtil.defaults(tickModel.getModel('lineStyle').getLineStyle(), { 
 | 
        stroke: angleAxisModel.get(['axisLine', 'lineStyle', 'color']) 
 | 
      }) 
 | 
    })); 
 | 
  }, 
 | 
  minorTick: function (group, angleAxisModel, polar, tickAngles, minorTickAngles, radiusExtent) { 
 | 
    if (!minorTickAngles.length) { 
 | 
      return; 
 | 
    } 
 | 
    var tickModel = angleAxisModel.getModel('axisTick'); 
 | 
    var minorTickModel = angleAxisModel.getModel('minorTick'); 
 | 
    var tickLen = (tickModel.get('inside') ? -1 : 1) * minorTickModel.get('length'); 
 | 
    var radius = radiusExtent[getRadiusIdx(polar)]; 
 | 
    var lines = []; 
 | 
    for (var i = 0; i < minorTickAngles.length; i++) { 
 | 
      for (var k = 0; k < minorTickAngles[i].length; k++) { 
 | 
        lines.push(new graphic.Line({ 
 | 
          shape: getAxisLineShape(polar, [radius, radius + tickLen], minorTickAngles[i][k].coord) 
 | 
        })); 
 | 
      } 
 | 
    } 
 | 
    group.add(graphic.mergePath(lines, { 
 | 
      style: zrUtil.defaults(minorTickModel.getModel('lineStyle').getLineStyle(), zrUtil.defaults(tickModel.getLineStyle(), { 
 | 
        stroke: angleAxisModel.get(['axisLine', 'lineStyle', 'color']) 
 | 
      })) 
 | 
    })); 
 | 
  }, 
 | 
  axisLabel: function (group, angleAxisModel, polar, ticksAngles, minorTickAngles, radiusExtent, labels) { 
 | 
    var rawCategoryData = angleAxisModel.getCategories(true); 
 | 
    var commonLabelModel = angleAxisModel.getModel('axisLabel'); 
 | 
    var labelMargin = commonLabelModel.get('margin'); 
 | 
    var triggerEvent = angleAxisModel.get('triggerEvent'); 
 | 
    // Use length of ticksAngles because it may remove the last tick to avoid overlapping 
 | 
    zrUtil.each(labels, function (labelItem, idx) { 
 | 
      var labelModel = commonLabelModel; 
 | 
      var tickValue = labelItem.tickValue; 
 | 
      var r = radiusExtent[getRadiusIdx(polar)]; 
 | 
      var p = polar.coordToPoint([r + labelMargin, labelItem.coord]); 
 | 
      var cx = polar.cx; 
 | 
      var cy = polar.cy; 
 | 
      var labelTextAlign = Math.abs(p[0] - cx) / r < 0.3 ? 'center' : p[0] > cx ? 'left' : 'right'; 
 | 
      var labelTextVerticalAlign = Math.abs(p[1] - cy) / r < 0.3 ? 'middle' : p[1] > cy ? 'top' : 'bottom'; 
 | 
      if (rawCategoryData && rawCategoryData[tickValue]) { 
 | 
        var rawCategoryItem = rawCategoryData[tickValue]; 
 | 
        if (zrUtil.isObject(rawCategoryItem) && rawCategoryItem.textStyle) { 
 | 
          labelModel = new Model(rawCategoryItem.textStyle, commonLabelModel, commonLabelModel.ecModel); 
 | 
        } 
 | 
      } 
 | 
      var textEl = new graphic.Text({ 
 | 
        silent: AxisBuilder.isLabelSilent(angleAxisModel), 
 | 
        style: createTextStyle(labelModel, { 
 | 
          x: p[0], 
 | 
          y: p[1], 
 | 
          fill: labelModel.getTextColor() || angleAxisModel.get(['axisLine', 'lineStyle', 'color']), 
 | 
          text: labelItem.formattedLabel, 
 | 
          align: labelTextAlign, 
 | 
          verticalAlign: labelTextVerticalAlign 
 | 
        }) 
 | 
      }); 
 | 
      group.add(textEl); 
 | 
      // Pack data for mouse event 
 | 
      if (triggerEvent) { 
 | 
        var eventData = AxisBuilder.makeAxisEventDataBase(angleAxisModel); 
 | 
        eventData.targetType = 'axisLabel'; 
 | 
        eventData.value = labelItem.rawLabel; 
 | 
        getECData(textEl).eventData = eventData; 
 | 
      } 
 | 
    }, this); 
 | 
  }, 
 | 
  splitLine: function (group, angleAxisModel, polar, ticksAngles, minorTickAngles, radiusExtent) { 
 | 
    var splitLineModel = angleAxisModel.getModel('splitLine'); 
 | 
    var lineStyleModel = splitLineModel.getModel('lineStyle'); 
 | 
    var lineColors = lineStyleModel.get('color'); 
 | 
    var lineCount = 0; 
 | 
    lineColors = lineColors instanceof Array ? lineColors : [lineColors]; 
 | 
    var splitLines = []; 
 | 
    for (var i = 0; i < ticksAngles.length; i++) { 
 | 
      var colorIndex = lineCount++ % lineColors.length; 
 | 
      splitLines[colorIndex] = splitLines[colorIndex] || []; 
 | 
      splitLines[colorIndex].push(new graphic.Line({ 
 | 
        shape: getAxisLineShape(polar, radiusExtent, ticksAngles[i].coord) 
 | 
      })); 
 | 
    } 
 | 
    // Simple optimization 
 | 
    // Batching the lines if color are the same 
 | 
    for (var i = 0; i < splitLines.length; i++) { 
 | 
      group.add(graphic.mergePath(splitLines[i], { 
 | 
        style: zrUtil.defaults({ 
 | 
          stroke: lineColors[i % lineColors.length] 
 | 
        }, lineStyleModel.getLineStyle()), 
 | 
        silent: true, 
 | 
        z: angleAxisModel.get('z') 
 | 
      })); 
 | 
    } 
 | 
  }, 
 | 
  minorSplitLine: function (group, angleAxisModel, polar, ticksAngles, minorTickAngles, radiusExtent) { 
 | 
    if (!minorTickAngles.length) { 
 | 
      return; 
 | 
    } 
 | 
    var minorSplitLineModel = angleAxisModel.getModel('minorSplitLine'); 
 | 
    var lineStyleModel = minorSplitLineModel.getModel('lineStyle'); 
 | 
    var lines = []; 
 | 
    for (var i = 0; i < minorTickAngles.length; i++) { 
 | 
      for (var k = 0; k < minorTickAngles[i].length; k++) { 
 | 
        lines.push(new graphic.Line({ 
 | 
          shape: getAxisLineShape(polar, radiusExtent, minorTickAngles[i][k].coord) 
 | 
        })); 
 | 
      } 
 | 
    } 
 | 
    group.add(graphic.mergePath(lines, { 
 | 
      style: lineStyleModel.getLineStyle(), 
 | 
      silent: true, 
 | 
      z: angleAxisModel.get('z') 
 | 
    })); 
 | 
  }, 
 | 
  splitArea: function (group, angleAxisModel, polar, ticksAngles, minorTickAngles, radiusExtent) { 
 | 
    if (!ticksAngles.length) { 
 | 
      return; 
 | 
    } 
 | 
    var splitAreaModel = angleAxisModel.getModel('splitArea'); 
 | 
    var areaStyleModel = splitAreaModel.getModel('areaStyle'); 
 | 
    var areaColors = areaStyleModel.get('color'); 
 | 
    var lineCount = 0; 
 | 
    areaColors = areaColors instanceof Array ? areaColors : [areaColors]; 
 | 
    var splitAreas = []; 
 | 
    var RADIAN = Math.PI / 180; 
 | 
    var prevAngle = -ticksAngles[0].coord * RADIAN; 
 | 
    var r0 = Math.min(radiusExtent[0], radiusExtent[1]); 
 | 
    var r1 = Math.max(radiusExtent[0], radiusExtent[1]); 
 | 
    var clockwise = angleAxisModel.get('clockwise'); 
 | 
    for (var i = 1, len = ticksAngles.length; i <= len; i++) { 
 | 
      var coord = i === len ? ticksAngles[0].coord : ticksAngles[i].coord; 
 | 
      var colorIndex = lineCount++ % areaColors.length; 
 | 
      splitAreas[colorIndex] = splitAreas[colorIndex] || []; 
 | 
      splitAreas[colorIndex].push(new graphic.Sector({ 
 | 
        shape: { 
 | 
          cx: polar.cx, 
 | 
          cy: polar.cy, 
 | 
          r0: r0, 
 | 
          r: r1, 
 | 
          startAngle: prevAngle, 
 | 
          endAngle: -coord * RADIAN, 
 | 
          clockwise: clockwise 
 | 
        }, 
 | 
        silent: true 
 | 
      })); 
 | 
      prevAngle = -coord * RADIAN; 
 | 
    } 
 | 
    // Simple optimization 
 | 
    // Batching the lines if color are the same 
 | 
    for (var i = 0; i < splitAreas.length; i++) { 
 | 
      group.add(graphic.mergePath(splitAreas[i], { 
 | 
        style: zrUtil.defaults({ 
 | 
          fill: areaColors[i % areaColors.length] 
 | 
        }, areaStyleModel.getAreaStyle()), 
 | 
        silent: true 
 | 
      })); 
 | 
    } 
 | 
  } 
 | 
}; 
 | 
export default AngleAxisView; 
 |