/** * @private * @class Ext.chart.axis.sprite.Axis3D * @extends Ext.chart.axis.sprite.Axis * * The {@link Ext.chart.axis.Axis3D 3D axis} sprite. * Only 3D cartesian axes are rendered with this sprite. */ Ext.define('Ext.chart.axis.sprite.Axis3D', { extend: 'Ext.chart.axis.sprite.Axis', alias: 'sprite.axis3d', type: 'axis3d', inheritableStatics: { def: { processors: { depth: 'number' }, defaults: { depth: 0 }, triggers: { depth: 'layout' } } }, config: { fx: { customDurations: { depth: 0 } } }, layoutUpdater: function () { var me = this, chart = me.getAxis().getChart(); if (chart.isInitializing) { return; } var attr = me.attr, layout = me.getLayout(), depth = layout.isDiscrete ? 0 : attr.depth, isRtl = chart.getInherited().rtl, min = attr.dataMin + (attr.dataMax - attr.dataMin) * attr.visibleMin, max = attr.dataMin + (attr.dataMax - attr.dataMin) * attr.visibleMax, context = { attr: attr, segmenter: me.getSegmenter(), renderer: me.defaultRenderer }; if (attr.position === 'left' || attr.position === 'right') { attr.translationX = 0; attr.translationY = max * (attr.length - depth) / (max - min) + depth; attr.scalingX = 1; attr.scalingY = (-attr.length + depth) / (max - min); attr.scalingCenterY = 0; attr.scalingCenterX = 0; me.applyTransformations(true); } else if (attr.position === 'top' || attr.position === 'bottom') { if (isRtl) { attr.translationX = attr.length + min * attr.length / (max - min) + 1; } else { attr.translationX = -min * attr.length / (max - min); } attr.translationY = 0; attr.scalingX = (isRtl ? -1 : 1) * (attr.length - depth) / (max - min); attr.scalingY = 1; attr.scalingCenterY = 0; attr.scalingCenterX = 0; me.applyTransformations(true); } if (layout) { layout.calculateLayout(context); me.setLayoutContext(context); } }, renderAxisLine: function (surface, ctx, layout, clipRect) { var me = this, attr = me.attr, halfLineWidth = attr.lineWidth * 0.5, layout = me.getLayout(), depth = layout.isDiscrete ? 0 : attr.depth, docked = attr.position, position, gaugeAngles; if (attr.axisLine && attr.length) { switch (docked) { case 'left': position = surface.roundPixel(clipRect[2]) - halfLineWidth; ctx.moveTo(position, -attr.endGap + depth); ctx.lineTo(position, attr.length + attr.startGap); break; case 'right': ctx.moveTo(halfLineWidth, -attr.endGap); ctx.lineTo(halfLineWidth, attr.length + attr.startGap); break; case 'bottom': ctx.moveTo(-attr.startGap, halfLineWidth); ctx.lineTo(attr.length - depth + attr.endGap, halfLineWidth); break; case 'top': position = surface.roundPixel(clipRect[3]) - halfLineWidth; ctx.moveTo(-attr.startGap, position); ctx.lineTo(attr.length + attr.endGap, position); break; case 'angular': ctx.moveTo(attr.centerX + attr.length, attr.centerY); ctx.arc(attr.centerX, attr.centerY, attr.length, 0, Math.PI * 2, true); break; case 'gauge': gaugeAngles = me.getGaugeAngles(); ctx.moveTo(attr.centerX + Math.cos(gaugeAngles.start) * attr.length, attr.centerY + Math.sin(gaugeAngles.start) * attr.length); ctx.arc(attr.centerX, attr.centerY, attr.length, gaugeAngles.start, gaugeAngles.end, true); break; } } } });