| 
/* 
 | 
* 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 { parsePercent } from '../../util/number.js'; 
 | 
import * as zrUtil from 'zrender/lib/core/util.js'; 
 | 
// let PI2 = Math.PI * 2; 
 | 
var RADIAN = Math.PI / 180; 
 | 
export default function sunburstLayout(seriesType, ecModel, api) { 
 | 
  ecModel.eachSeriesByType(seriesType, function (seriesModel) { 
 | 
    var center = seriesModel.get('center'); 
 | 
    var radius = seriesModel.get('radius'); 
 | 
    if (!zrUtil.isArray(radius)) { 
 | 
      radius = [0, radius]; 
 | 
    } 
 | 
    if (!zrUtil.isArray(center)) { 
 | 
      center = [center, center]; 
 | 
    } 
 | 
    var width = api.getWidth(); 
 | 
    var height = api.getHeight(); 
 | 
    var size = Math.min(width, height); 
 | 
    var cx = parsePercent(center[0], width); 
 | 
    var cy = parsePercent(center[1], height); 
 | 
    var r0 = parsePercent(radius[0], size / 2); 
 | 
    var r = parsePercent(radius[1], size / 2); 
 | 
    var startAngle = -seriesModel.get('startAngle') * RADIAN; 
 | 
    var minAngle = seriesModel.get('minAngle') * RADIAN; 
 | 
    var virtualRoot = seriesModel.getData().tree.root; 
 | 
    var treeRoot = seriesModel.getViewRoot(); 
 | 
    var rootDepth = treeRoot.depth; 
 | 
    var sort = seriesModel.get('sort'); 
 | 
    if (sort != null) { 
 | 
      initChildren(treeRoot, sort); 
 | 
    } 
 | 
    var validDataCount = 0; 
 | 
    zrUtil.each(treeRoot.children, function (child) { 
 | 
      !isNaN(child.getValue()) && validDataCount++; 
 | 
    }); 
 | 
    var sum = treeRoot.getValue(); 
 | 
    // Sum may be 0 
 | 
    var unitRadian = Math.PI / (sum || validDataCount) * 2; 
 | 
    var renderRollupNode = treeRoot.depth > 0; 
 | 
    var levels = treeRoot.height - (renderRollupNode ? -1 : 1); 
 | 
    var rPerLevel = (r - r0) / (levels || 1); 
 | 
    var clockwise = seriesModel.get('clockwise'); 
 | 
    var stillShowZeroSum = seriesModel.get('stillShowZeroSum'); 
 | 
    // In the case some sector angle is smaller than minAngle 
 | 
    // let restAngle = PI2; 
 | 
    // let valueSumLargerThanMinAngle = 0; 
 | 
    var dir = clockwise ? 1 : -1; 
 | 
    /** 
 | 
     * Render a tree 
 | 
     * @return increased angle 
 | 
     */ 
 | 
    var renderNode = function (node, startAngle) { 
 | 
      if (!node) { 
 | 
        return; 
 | 
      } 
 | 
      var endAngle = startAngle; 
 | 
      // Render self 
 | 
      if (node !== virtualRoot) { 
 | 
        // Tree node is virtual, so it doesn't need to be drawn 
 | 
        var value = node.getValue(); 
 | 
        var angle = sum === 0 && stillShowZeroSum ? unitRadian : value * unitRadian; 
 | 
        if (angle < minAngle) { 
 | 
          angle = minAngle; 
 | 
          // restAngle -= minAngle; 
 | 
        } 
 | 
        // else { 
 | 
        //     valueSumLargerThanMinAngle += value; 
 | 
        // } 
 | 
        endAngle = startAngle + dir * angle; 
 | 
        var depth = node.depth - rootDepth - (renderRollupNode ? -1 : 1); 
 | 
        var rStart = r0 + rPerLevel * depth; 
 | 
        var rEnd = r0 + rPerLevel * (depth + 1); 
 | 
        var levelModel = seriesModel.getLevelModel(node); 
 | 
        if (levelModel) { 
 | 
          var r0_1 = levelModel.get('r0', true); 
 | 
          var r_1 = levelModel.get('r', true); 
 | 
          var radius_1 = levelModel.get('radius', true); 
 | 
          if (radius_1 != null) { 
 | 
            r0_1 = radius_1[0]; 
 | 
            r_1 = radius_1[1]; 
 | 
          } 
 | 
          r0_1 != null && (rStart = parsePercent(r0_1, size / 2)); 
 | 
          r_1 != null && (rEnd = parsePercent(r_1, size / 2)); 
 | 
        } 
 | 
        node.setLayout({ 
 | 
          angle: angle, 
 | 
          startAngle: startAngle, 
 | 
          endAngle: endAngle, 
 | 
          clockwise: clockwise, 
 | 
          cx: cx, 
 | 
          cy: cy, 
 | 
          r0: rStart, 
 | 
          r: rEnd 
 | 
        }); 
 | 
      } 
 | 
      // Render children 
 | 
      if (node.children && node.children.length) { 
 | 
        // currentAngle = startAngle; 
 | 
        var siblingAngle_1 = 0; 
 | 
        zrUtil.each(node.children, function (node) { 
 | 
          siblingAngle_1 += renderNode(node, startAngle + siblingAngle_1); 
 | 
        }); 
 | 
      } 
 | 
      return endAngle - startAngle; 
 | 
    }; 
 | 
    // Virtual root node for roll up 
 | 
    if (renderRollupNode) { 
 | 
      var rStart = r0; 
 | 
      var rEnd = r0 + rPerLevel; 
 | 
      var angle = Math.PI * 2; 
 | 
      virtualRoot.setLayout({ 
 | 
        angle: angle, 
 | 
        startAngle: startAngle, 
 | 
        endAngle: startAngle + angle, 
 | 
        clockwise: clockwise, 
 | 
        cx: cx, 
 | 
        cy: cy, 
 | 
        r0: rStart, 
 | 
        r: rEnd 
 | 
      }); 
 | 
    } 
 | 
    renderNode(treeRoot, startAngle); 
 | 
  }); 
 | 
} 
 | 
/** 
 | 
 * Init node children by order and update visual 
 | 
 */ 
 | 
function initChildren(node, sortOrder) { 
 | 
  var children = node.children || []; 
 | 
  node.children = sort(children, sortOrder); 
 | 
  // Init children recursively 
 | 
  if (children.length) { 
 | 
    zrUtil.each(node.children, function (child) { 
 | 
      initChildren(child, sortOrder); 
 | 
    }); 
 | 
  } 
 | 
} 
 | 
/** 
 | 
 * Sort children nodes 
 | 
 * 
 | 
 * @param {TreeNode[]}               children children of node to be sorted 
 | 
 * @param {string | function | null} sort sort method 
 | 
 *                                   See SunburstSeries.js for details. 
 | 
 */ 
 | 
function sort(children, sortOrder) { 
 | 
  if (zrUtil.isFunction(sortOrder)) { 
 | 
    var sortTargets = zrUtil.map(children, function (child, idx) { 
 | 
      var value = child.getValue(); 
 | 
      return { 
 | 
        params: { 
 | 
          depth: child.depth, 
 | 
          height: child.height, 
 | 
          dataIndex: child.dataIndex, 
 | 
          getValue: function () { 
 | 
            return value; 
 | 
          } 
 | 
        }, 
 | 
        index: idx 
 | 
      }; 
 | 
    }); 
 | 
    sortTargets.sort(function (a, b) { 
 | 
      return sortOrder(a.params, b.params); 
 | 
    }); 
 | 
    return zrUtil.map(sortTargets, function (target) { 
 | 
      return children[target.index]; 
 | 
    }); 
 | 
  } else { 
 | 
    var isAsc_1 = sortOrder === 'asc'; 
 | 
    return children.sort(function (a, b) { 
 | 
      var diff = (a.getValue() - b.getValue()) * (isAsc_1 ? 1 : -1); 
 | 
      return diff === 0 ? (a.dataIndex - b.dataIndex) * (isAsc_1 ? -1 : 1) : diff; 
 | 
    }); 
 | 
  } 
 | 
} 
 |