You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							151 lines
						
					
					
						
							5.5 KiB
						
					
					
				
			
		
		
	
	
							151 lines
						
					
					
						
							5.5 KiB
						
					
					
				
 | 
						|
/* | 
						|
* 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 formatUtil = require("../../util/format"); | 
						|
 | 
						|
var BaseAxisPointer = require("./BaseAxisPointer"); | 
						|
 | 
						|
var graphic = require("../../util/graphic"); | 
						|
 | 
						|
var viewHelper = require("./viewHelper"); | 
						|
 | 
						|
var matrix = require("zrender/lib/core/matrix"); | 
						|
 | 
						|
var AxisBuilder = require("../axis/AxisBuilder"); | 
						|
 | 
						|
var AxisView = require("../axis/AxisView"); | 
						|
 | 
						|
/* | 
						|
* 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 PolarAxisPointer = BaseAxisPointer.extend({ | 
						|
  /** | 
						|
   * @override | 
						|
   */ | 
						|
  makeElOption: function (elOption, value, axisModel, axisPointerModel, api) { | 
						|
    var axis = axisModel.axis; | 
						|
 | 
						|
    if (axis.dim === 'angle') { | 
						|
      this.animationThreshold = Math.PI / 18; | 
						|
    } | 
						|
 | 
						|
    var polar = axis.polar; | 
						|
    var otherAxis = polar.getOtherAxis(axis); | 
						|
    var otherExtent = otherAxis.getExtent(); | 
						|
    var coordValue; | 
						|
    coordValue = axis['dataTo' + formatUtil.capitalFirst(axis.dim)](value); | 
						|
    var axisPointerType = axisPointerModel.get('type'); | 
						|
 | 
						|
    if (axisPointerType && axisPointerType !== 'none') { | 
						|
      var elStyle = viewHelper.buildElStyle(axisPointerModel); | 
						|
      var pointerOption = pointerShapeBuilder[axisPointerType](axis, polar, coordValue, otherExtent, elStyle); | 
						|
      pointerOption.style = elStyle; | 
						|
      elOption.graphicKey = pointerOption.type; | 
						|
      elOption.pointer = pointerOption; | 
						|
    } | 
						|
 | 
						|
    var labelMargin = axisPointerModel.get('label.margin'); | 
						|
    var labelPos = getLabelPosition(value, axisModel, axisPointerModel, polar, labelMargin); | 
						|
    viewHelper.buildLabelElOption(elOption, axisModel, axisPointerModel, api, labelPos); | 
						|
  } // Do not support handle, utill any user requires it. | 
						|
 | 
						|
}); | 
						|
 | 
						|
function getLabelPosition(value, axisModel, axisPointerModel, polar, labelMargin) { | 
						|
  var axis = axisModel.axis; | 
						|
  var coord = axis.dataToCoord(value); | 
						|
  var axisAngle = polar.getAngleAxis().getExtent()[0]; | 
						|
  axisAngle = axisAngle / 180 * Math.PI; | 
						|
  var radiusExtent = polar.getRadiusAxis().getExtent(); | 
						|
  var position; | 
						|
  var align; | 
						|
  var verticalAlign; | 
						|
 | 
						|
  if (axis.dim === 'radius') { | 
						|
    var transform = matrix.create(); | 
						|
    matrix.rotate(transform, transform, axisAngle); | 
						|
    matrix.translate(transform, transform, [polar.cx, polar.cy]); | 
						|
    position = graphic.applyTransform([coord, -labelMargin], transform); | 
						|
    var labelRotation = axisModel.getModel('axisLabel').get('rotate') || 0; | 
						|
    var labelLayout = AxisBuilder.innerTextLayout(axisAngle, labelRotation * Math.PI / 180, -1); | 
						|
    align = labelLayout.textAlign; | 
						|
    verticalAlign = labelLayout.textVerticalAlign; | 
						|
  } else { | 
						|
    // angle axis | 
						|
    var r = radiusExtent[1]; | 
						|
    position = polar.coordToPoint([r + labelMargin, coord]); | 
						|
    var cx = polar.cx; | 
						|
    var cy = polar.cy; | 
						|
    align = Math.abs(position[0] - cx) / r < 0.3 ? 'center' : position[0] > cx ? 'left' : 'right'; | 
						|
    verticalAlign = Math.abs(position[1] - cy) / r < 0.3 ? 'middle' : position[1] > cy ? 'top' : 'bottom'; | 
						|
  } | 
						|
 | 
						|
  return { | 
						|
    position: position, | 
						|
    align: align, | 
						|
    verticalAlign: verticalAlign | 
						|
  }; | 
						|
} | 
						|
 | 
						|
var pointerShapeBuilder = { | 
						|
  line: function (axis, polar, coordValue, otherExtent, elStyle) { | 
						|
    return axis.dim === 'angle' ? { | 
						|
      type: 'Line', | 
						|
      shape: viewHelper.makeLineShape(polar.coordToPoint([otherExtent[0], coordValue]), polar.coordToPoint([otherExtent[1], coordValue])) | 
						|
    } : { | 
						|
      type: 'Circle', | 
						|
      shape: { | 
						|
        cx: polar.cx, | 
						|
        cy: polar.cy, | 
						|
        r: coordValue | 
						|
      } | 
						|
    }; | 
						|
  }, | 
						|
  shadow: function (axis, polar, coordValue, otherExtent, elStyle) { | 
						|
    var bandWidth = Math.max(1, axis.getBandWidth()); | 
						|
    var radian = Math.PI / 180; | 
						|
    return axis.dim === 'angle' ? { | 
						|
      type: 'Sector', | 
						|
      shape: viewHelper.makeSectorShape(polar.cx, polar.cy, otherExtent[0], otherExtent[1], // In ECharts y is negative if angle is positive | 
						|
      (-coordValue - bandWidth / 2) * radian, (-coordValue + bandWidth / 2) * radian) | 
						|
    } : { | 
						|
      type: 'Sector', | 
						|
      shape: viewHelper.makeSectorShape(polar.cx, polar.cy, coordValue - bandWidth / 2, coordValue + bandWidth / 2, 0, Math.PI * 2) | 
						|
    }; | 
						|
  } | 
						|
}; | 
						|
AxisView.registerAxisPointerClass('PolarAxisPointer', PolarAxisPointer); | 
						|
var _default = PolarAxisPointer; | 
						|
module.exports = _default; |