Esempio n. 1
0
        private void DrawRadiusAxis(VertexHelper vh)
        {
            var startAngle = m_AngleAxis.runtimeStartAngle;
            var radius     = m_Polar.runtimeRadius;
            var cenPos     = m_Polar.runtimeCenterPos;
            var size       = AxisHelper.GetScaleNumber(m_RadiusAxis, radius, null);
            var totalWidth = 0f;
            var dire       = ChartHelper.GetDire(startAngle, true).normalized;
            var tickVetor  = ChartHelper.GetVertialDire(dire) * m_RadiusAxis.axisTick.length;
            var tickWidth  = AxisHelper.GetTickWidth(m_RadiusAxis);

            for (int i = 0; i < size; i++)
            {
                var scaleWidth = AxisHelper.GetScaleWidth(m_RadiusAxis, radius, i);
                var pos        = ChartHelper.GetPos(cenPos, totalWidth, startAngle, true);
                if (m_RadiusAxis.show && m_RadiusAxis.splitLine.show)
                {
                    var outsideRaidus  = totalWidth + m_RadiusAxis.splitLine.lineStyle.width * 2;
                    var splitLineColor = m_RadiusAxis.splitLine.GetColor(m_ThemeInfo);
                    ChartDrawer.DrawDoughnut(vh, cenPos, totalWidth, outsideRaidus, splitLineColor, Color.clear);
                }
                if (m_RadiusAxis.show && m_RadiusAxis.axisTick.show)
                {
                    ChartDrawer.DrawLine(vh, pos, pos + tickVetor, tickWidth, m_ThemeInfo.axisLineColor);
                }
                totalWidth += scaleWidth;
            }
            if (m_RadiusAxis.show && m_RadiusAxis.axisLine.show)
            {
                var lineStartPos = m_Polar.runtimeCenterPos - dire * m_RadiusAxis.axisTick.width;
                var lineEndPos   = m_Polar.runtimeCenterPos + dire * (radius + m_RadiusAxis.axisTick.width);
                ChartDrawer.DrawLine(vh, lineStartPos, lineEndPos, m_RadiusAxis.axisLine.width, m_ThemeInfo.axisLineColor);
            }
        }
Esempio n. 2
0
        private void DrawAngleAxis(VertexHelper vh)
        {
            var radius    = m_Polar.runtimeRadius;
            var cenPos    = m_Polar.runtimeCenterPos;
            var total     = 360;
            var size      = AxisHelper.GetScaleNumber(m_AngleAxis, total, null);
            var currAngle = m_AngleAxis.runtimeStartAngle;
            var tickWidth = AxisHelper.GetTickWidth(m_AngleAxis);

            for (int i = 0; i < size; i++)
            {
                var scaleWidth = AxisHelper.GetScaleWidth(m_AngleAxis, total, i);
                var pos        = ChartHelper.GetPos(cenPos, radius, currAngle, true);
                if (m_AngleAxis.show && m_AngleAxis.splitLine.show)
                {
                    var splitLineColor = m_AngleAxis.splitLine.GetColor(m_ThemeInfo);
                    ChartDrawer.DrawLine(vh, cenPos, pos, m_AngleAxis.splitLine.lineStyle.width, splitLineColor);
                }
                if (m_AngleAxis.show && m_AngleAxis.axisTick.show)
                {
                    var tickPos = ChartHelper.GetPos(cenPos, radius + m_AngleAxis.axisTick.length, currAngle, true);
                    ChartDrawer.DrawLine(vh, pos, tickPos, tickWidth, m_ThemeInfo.axisLineColor);
                }
                currAngle += scaleWidth;
            }
            if (m_AngleAxis.show && m_AngleAxis.axisLine.show)
            {
                var outsideRaidus = radius + m_AngleAxis.axisLine.width * 2;
                ChartDrawer.DrawDoughnut(vh, cenPos, radius, outsideRaidus, m_ThemeInfo.axisLineColor, Color.clear);
            }
        }
 private void DrawRadiusAxis(VertexHelper vh)
 {
     foreach (var radiusAxis in m_RadiusAxes)
     {
         var polar = GetPolar(radiusAxis.polarIndex);
         if (polar == null)
         {
             continue;
         }
         var angleAxis = GetAngleAxis(polar.index);
         if (angleAxis == null)
         {
             continue;
         }
         var startAngle = angleAxis.runtimeStartAngle;
         var radius     = polar.runtimeRadius;
         var cenPos     = polar.runtimeCenterPos;
         var size       = AxisHelper.GetScaleNumber(radiusAxis, radius, null);
         var totalWidth = 0f;
         var dire       = ChartHelper.GetDire(startAngle, true).normalized;
         var tickWidth  = radiusAxis.axisTick.GetLength(m_Theme.radiusAxis.tickWidth);
         var tickLength = radiusAxis.axisTick.GetLength(m_Theme.radiusAxis.tickLength);
         var tickVetor  = ChartHelper.GetVertialDire(dire) * tickLength;
         for (int i = 0; i < size - 1; i++)
         {
             var scaleWidth = AxisHelper.GetScaleWidth(radiusAxis, radius, i);
             var pos        = ChartHelper.GetPos(cenPos, totalWidth, startAngle, true);
             if (radiusAxis.show && radiusAxis.splitLine.show)
             {
                 var outsideRaidus  = totalWidth + radiusAxis.splitLine.GetWidth(m_Theme.radiusAxis.splitLineWidth) * 2;
                 var splitLineColor = radiusAxis.splitLine.GetColor(m_Theme.radiusAxis.splitLineColor);
                 UGL.DrawDoughnut(vh, cenPos, totalWidth, outsideRaidus, splitLineColor, Color.clear);
             }
             if (radiusAxis.show && radiusAxis.axisTick.show)
             {
                 UGL.DrawLine(vh, pos, pos + tickVetor, tickWidth, m_Theme.axis.lineColor);
             }
             totalWidth += scaleWidth;
         }
         if (radiusAxis.show && radiusAxis.axisLine.show)
         {
             var lineStartPos = polar.runtimeCenterPos - dire * tickWidth;
             var lineEndPos   = polar.runtimeCenterPos + dire * (radius + tickWidth);
             var lineWidth    = radiusAxis.axisLine.GetWidth(m_Theme.polar.lineWidth);
             UGL.DrawLine(vh, lineStartPos, lineEndPos, lineWidth, m_Theme.axis.lineColor);
         }
     }
 }
 private void DrawAngleAxis(VertexHelper vh)
 {
     foreach (var m_AngleAxis in m_AngleAxes)
     {
         var m_Polar    = GetPolar(m_AngleAxis.polarIndex);
         var radius     = m_Polar.runtimeRadius;
         var cenPos     = m_Polar.runtimeCenterPos;
         var total      = 360;
         var size       = AxisHelper.GetScaleNumber(m_AngleAxis, total, null);
         var currAngle  = m_AngleAxis.runtimeStartAngle;
         var tickWidth  = m_AngleAxis.axisTick.GetWidth(m_Theme.angleAxis.tickWidth);
         var tickLength = m_AngleAxis.axisTick.GetLength(m_Theme.angleAxis.tickLength);
         for (int i = 0; i < size; i++)
         {
             var scaleWidth = AxisHelper.GetScaleWidth(m_AngleAxis, total, i);
             var pos        = ChartHelper.GetPos(cenPos, radius, currAngle, true);
             if (m_AngleAxis.show && m_AngleAxis.splitLine.show)
             {
                 var splitLineColor = m_AngleAxis.splitLine.GetColor(m_Theme.angleAxis.splitLineColor);
                 var lineWidth      = m_AngleAxis.splitLine.GetWidth(m_Theme.angleAxis.splitLineWidth);
                 UGL.DrawLine(vh, cenPos, pos, lineWidth, splitLineColor);
             }
             if (m_AngleAxis.show && m_AngleAxis.axisTick.show)
             {
                 var tickY   = radius + tickLength;
                 var tickPos = ChartHelper.GetPos(cenPos, tickY, currAngle, true);
                 UGL.DrawLine(vh, pos, tickPos, tickWidth, m_Theme.axis.lineColor);
             }
             currAngle += scaleWidth;
         }
         if (m_AngleAxis.show && m_AngleAxis.axisLine.show)
         {
             var lineWidth     = m_AngleAxis.axisLine.GetWidth(m_Theme.angleAxis.lineWidth);
             var outsideRaidus = radius + lineWidth * 2;
             UGL.DrawDoughnut(vh, cenPos, radius, outsideRaidus, m_Theme.axis.lineColor, Color.clear);
         }
     }
 }
        protected void DrawAxisSplit(VertexHelper vh, AxisTheme theme, DataZoom dataZoom,
                                     Orient orient, float startX, float startY, float axisLength, float splitLength, Axis relativedAxis = null)
        {
            Axis axis      = component;
            var  lineColor = axis.splitLine.GetColor(theme.splitLineColor);
            var  lineWidth = axis.splitLine.GetWidth(theme.lineWidth);
            var  lineType  = axis.splitLine.GetType(theme.splitLineType);

            var size = AxisHelper.GetScaleNumber(axis, axisLength, dataZoom);

            if (axis.IsTime())
            {
                size += 1;
                if (!ChartHelper.IsEquals(axis.GetLastLabelValue(), axis.context.maxValue))
                {
                    size += 1;
                }
            }

            var current = orient == Orient.Horizonal ?
                          startX :
                          startY;

            for (int i = 0; i < size; i++)
            {
                var scaleWidth = AxisHelper.GetScaleWidth(axis, axisLength, axis.IsTime() ? i : i + 1, dataZoom);

                if (axis.boundaryGap && axis.axisTick.alignWithLabel)
                {
                    current -= scaleWidth / 2;
                }

                if (axis.splitArea.show && i <= size - 1)
                {
                    if (orient == Orient.Horizonal)
                    {
                        UGL.DrawQuadrilateral(vh,
                                              new Vector2(current, startY),
                                              new Vector2(current, startY + splitLength),
                                              new Vector2(current + scaleWidth, startY + splitLength),
                                              new Vector2(current + scaleWidth, startY),
                                              axis.splitArea.GetColor(i, theme));
                    }
                    else
                    {
                        UGL.DrawQuadrilateral(vh,
                                              new Vector2(startX, current),
                                              new Vector2(startX + splitLength, current),
                                              new Vector2(startX + splitLength, current + scaleWidth),
                                              new Vector2(startX, current + scaleWidth),
                                              axis.splitArea.GetColor(i, theme));
                    }
                }
                if (axis.splitLine.show)
                {
                    if (axis.splitLine.NeedShow(i))
                    {
                        if (orient == Orient.Horizonal)
                        {
                            if (relativedAxis == null || !MathUtil.Approximately(current, GetAxisLineXOrY()))
                            {
                                ChartDrawer.DrawLineStyle(vh,
                                                          lineType,
                                                          lineWidth,
                                                          new Vector3(current, startY),
                                                          new Vector3(current, startY + splitLength),
                                                          lineColor);
                            }
                        }
                        else
                        {
                            if (relativedAxis == null || !MathUtil.Approximately(current, GetAxisLineXOrY()))
                            {
                                ChartDrawer.DrawLineStyle(vh,
                                                          lineType,
                                                          lineWidth,
                                                          new Vector3(startX, current),
                                                          new Vector3(startX + splitLength, current),
                                                          lineColor);
                            }
                        }
                    }
                }
                current += scaleWidth;
            }
        }
        internal static void DrawAxisTick(VertexHelper vh, Axis axis, AxisTheme theme, DataZoom dataZoom,
                                          Orient orient, float startX, float startY, float axisLength)
        {
            var lineWidth  = axis.axisLine.GetWidth(theme.lineWidth);
            var tickLength = axis.axisTick.GetLength(theme.tickLength);

            if (AxisHelper.NeedShowSplit(axis))
            {
                var size = AxisHelper.GetScaleNumber(axis, axisLength, dataZoom);

                var current = orient == Orient.Horizonal ?
                              startX :
                              startY;

                for (int i = 0; i < size; i++)
                {
                    var scaleWidth = AxisHelper.GetScaleWidth(axis, axisLength, i + 1, dataZoom);
                    if (i == 0 && (!axis.axisTick.showStartTick || axis.axisTick.alignWithLabel))
                    {
                        current += scaleWidth;
                        continue;
                    }
                    if (i == size - 1 && !axis.axisTick.showEndTick)
                    {
                        current += scaleWidth;
                        continue;
                    }
                    if (axis.axisTick.show)
                    {
                        if (orient == Orient.Horizonal)
                        {
                            float pX = axis.IsTime() ?
                                       (startX + axis.GetDistance(axis.GetLabelValue(i), axisLength)) :
                                       current;

                            if (axis.boundaryGap && axis.axisTick.alignWithLabel)
                            {
                                pX -= scaleWidth / 2;
                            }

                            var sY = 0f;
                            var eY = 0f;
                            if ((axis.axisTick.inside && axis.IsBottom()) ||
                                (!axis.axisTick.inside && axis.IsTop()))
                            {
                                sY = startY + lineWidth;
                                eY = sY + tickLength;
                            }
                            else
                            {
                                sY = startY - lineWidth;
                                eY = sY - tickLength;
                            }

                            UGL.DrawLine(vh, new Vector3(pX, sY), new Vector3(pX, eY),
                                         axis.axisTick.GetWidth(theme.tickWidth),
                                         axis.axisTick.GetColor(theme.tickColor));
                        }
                        else
                        {
                            float pY = axis.IsTime() ?
                                       (startY + axis.GetDistance(axis.GetLabelValue(i), axisLength)) :
                                       current;

                            if (axis.boundaryGap && axis.axisTick.alignWithLabel)
                            {
                                pY -= scaleWidth / 2;
                            }

                            var sX = 0f;
                            var eX = 0f;
                            if ((axis.axisTick.inside && axis.IsLeft()) ||
                                (!axis.axisTick.inside && axis.IsRight()))
                            {
                                sX = startX + lineWidth;
                                eX = sX + tickLength;
                            }
                            else
                            {
                                sX = startX - lineWidth;
                                eX = sX - tickLength;
                            }

                            UGL.DrawLine(vh, new Vector3(sX, pY), new Vector3(eX, pY),
                                         axis.axisTick.GetWidth(theme.tickWidth),
                                         axis.axisTick.GetColor(theme.tickColor));
                        }
                    }
                    current += scaleWidth;
                }
            }
            if (axis.show && axis.axisLine.show && axis.axisLine.showArrow)
            {
                var lineY     = startY + axis.offset;
                var inverse   = axis.IsValue() && axis.inverse;
                var axisArrow = axis.axisLine.arrow;
                if (orient == Orient.Horizonal)
                {
                    if (inverse)
                    {
                        var startPos = new Vector3(startX + axisLength, lineY);
                        var arrowPos = new Vector3(startX, lineY);
                        UGL.DrawArrow(vh, startPos, arrowPos, axisArrow.width, axisArrow.height,
                                      axisArrow.offset, axisArrow.dent,
                                      axisArrow.GetColor(axis.axisLine.GetColor(theme.lineColor)));
                    }
                    else
                    {
                        var arrowPosX = startX + axisLength + lineWidth;
                        var startPos  = new Vector3(startX, lineY);
                        var arrowPos  = new Vector3(arrowPosX, lineY);
                        UGL.DrawArrow(vh, startPos, arrowPos, axisArrow.width, axisArrow.height,
                                      axisArrow.offset, axisArrow.dent,
                                      axisArrow.GetColor(axis.axisLine.GetColor(theme.lineColor)));
                    }
                }
                else
                {
                    if (inverse)
                    {
                        var startPos = new Vector3(startX, startY + axisLength);
                        var arrowPos = new Vector3(startX, startY);
                        UGL.DrawArrow(vh, startPos, arrowPos, axisArrow.width, axisArrow.height,
                                      axisArrow.offset, axisArrow.dent,
                                      axisArrow.GetColor(axis.axisLine.GetColor(theme.lineColor)));
                    }
                    else
                    {
                        var startPos = new Vector3(startX, startY);
                        var arrowPos = new Vector3(startX, startY + axisLength + lineWidth);
                        UGL.DrawArrow(vh, startPos, arrowPos, axisArrow.width, axisArrow.height,
                                      axisArrow.offset, axisArrow.dent,
                                      axisArrow.GetColor(axis.axisLine.GetColor(theme.lineColor)));
                    }
                }
            }
        }
        protected void InitAxis(Axis relativedAxis, Orient orient,
                                float axisStartX, float axisStartY, float axisLength, float relativedLength)
        {
            Axis axis = component;

            chart.InitAxisRuntimeData(axis);

            var objName = ChartCached.GetComponentObjectName(axis);
            var axisObj = ChartHelper.AddObject(objName,
                                                chart.transform,
                                                chart.chartMinAnchor,
                                                chart.chartMaxAnchor,
                                                chart.chartPivot,
                                                chart.chartSizeDelta);

            axisObj.SetActive(axis.show);
            axisObj.hideFlags = chart.chartHideFlags;
            ChartHelper.HideAllObject(axisObj);

            axis.gameObject = axisObj;
            axis.context.labelObjectList.Clear();

            if (!axis.show)
            {
                return;
            }

            var axisLabelTextStyle = axis.axisLabel.textStyle;
            var dataZoom           = chart.GetDataZoomOfAxis(axis);
            var splitNumber        = AxisHelper.GetScaleNumber(axis, axisLength, dataZoom);
            var totalWidth         = 0f;
            var eachWidth          = AxisHelper.GetEachWidth(axis, axisLength, dataZoom);
            var gapWidth           = axis.boundaryGap ? eachWidth / 2 : 0;

            var textWidth = axis.axisLabel.width > 0 ?
                            axis.axisLabel.width :
                            (orient == Orient.Horizonal ?
                             AxisHelper.GetScaleWidth(axis, axisLength, 0, dataZoom) :
                             (axisStartX - chart.chartX)
                            );

            var textHeight = axis.axisLabel.height > 0 ?
                             axis.axisLabel.height :
                             20f;

            var isPercentStack   = SeriesHelper.IsPercentStack <Bar>(chart.series);
            var inside           = axis.axisLabel.inside;
            var defaultAlignment = orient == Orient.Horizonal ? TextAnchor.MiddleCenter :
                                   ((inside && axis.IsLeft()) || (!inside && axis.IsRight()) ?
                                    TextAnchor.MiddleLeft :
                                    TextAnchor.MiddleRight);

            if (axis.IsCategory() && axis.boundaryGap)
            {
                splitNumber -= 1;
            }

            for (int i = 0; i < splitNumber; i++)
            {
                var labelWidth = AxisHelper.GetScaleWidth(axis, axisLength, i + 1, dataZoom);
                var labelName  = AxisHelper.GetLabelName(axis, axisLength, i,
                                                         axis.context.minValue,
                                                         axis.context.maxValue,
                                                         dataZoom, isPercentStack);

                var label = ChartHelper.AddAxisLabelObject(splitNumber, i,
                                                           ChartCached.GetAxisLabelName(i),
                                                           axisObj.transform,
                                                           new Vector2(textWidth, textHeight),
                                                           axis, chart.theme.axis, labelName,
                                                           Color.clear,
                                                           defaultAlignment);

                if (i == 0)
                {
                    axis.axisLabel.SetRelatedText(label.text, labelWidth);
                }

                var pos = GetLabelPosition(totalWidth + gapWidth, i);
                label.SetPosition(pos);
                CheckValueLabelActive(axis, i, label, pos);

                axis.context.labelObjectList.Add(label);

                totalWidth += labelWidth;
            }
            if (axis.axisName.show)
            {
                ChartLabel label         = null;
                var        relativedDist = (relativedAxis == null ? 0 : relativedAxis.context.offset);
                var        zeroPos       = new Vector3(axisStartX, axisStartY + relativedDist);
                var        offset        = axis.axisName.labelStyle.offset;
                var        autoColor     = axis.axisLine.GetColor(chart.theme.axis.lineColor);
                if (orient == Orient.Horizonal)
                {
                    var grid = chart.GetChartComponent <GridCoord>(axis.gridIndex);
                    var posY = !axis.axisName.onZero && grid != null? grid.context.y : GetAxisLineXOrY() + offset.y;
                    switch (axis.axisName.labelStyle.position)
                    {
                    case LabelStyle.Position.Start:

                        label = ChartHelper.AddChartLabel(s_DefaultAxisName, axisObj.transform, axis.axisName.labelStyle,
                                                          chart.theme.axis, axis.axisName.name, autoColor, TextAnchor.MiddleRight);
                        label.SetActive(axis.axisName.labelStyle.show);
                        label.SetPosition(axis.position == Axis.AxisPosition.Top ?
                                          new Vector2(zeroPos.x - offset.x, axisStartY + relativedLength + offset.y + axis.offset) :
                                          new Vector2(zeroPos.x - offset.x, posY));
                        break;

                    case LabelStyle.Position.Middle:

                        label = ChartHelper.AddChartLabel(s_DefaultAxisName, axisObj.transform, axis.axisName.labelStyle,
                                                          chart.theme.axis, axis.axisName.name, autoColor, TextAnchor.MiddleCenter);
                        label.SetActive(axis.axisName.labelStyle.show);
                        label.SetPosition(axis.position == Axis.AxisPosition.Top ?
                                          new Vector2(axisStartX + axisLength / 2 + offset.x, axisStartY + relativedLength - offset.y + axis.offset) :
                                          new Vector2(axisStartX + axisLength / 2 + offset.x, posY));
                        break;

                    default:

                        label = ChartHelper.AddChartLabel(s_DefaultAxisName, axisObj.transform, axis.axisName.labelStyle,
                                                          chart.theme.axis, axis.axisName.name, autoColor, TextAnchor.MiddleLeft);
                        label.SetActive(axis.axisName.labelStyle.show);
                        label.SetPosition(axis.position == Axis.AxisPosition.Top ?
                                          new Vector2(axisStartX + axisLength + offset.x, axisStartY + relativedLength + offset.y + axis.offset) :
                                          new Vector2(axisStartX + axisLength + offset.x, posY));
                        break;
                    }
                }
                else
                {
                    var grid = chart.GetChartComponent <GridCoord>(axis.gridIndex);
                    var posX = !axis.axisName.onZero && grid != null? grid.context.x : GetAxisLineXOrY() + offset.x;
                    switch (axis.axisName.labelStyle.position)
                    {
                    case LabelStyle.Position.Start:

                        label = ChartHelper.AddChartLabel(s_DefaultAxisName, axisObj.transform, axis.axisName.labelStyle,
                                                          chart.theme.axis, axis.axisName.name, autoColor, TextAnchor.MiddleCenter);
                        label.SetActive(axis.axisName.labelStyle.show);
                        label.SetPosition(axis.position == Axis.AxisPosition.Right ?
                                          new Vector2(axisStartX + relativedLength + offset.x + axis.offset, axisStartY - offset.y) :
                                          new Vector2(posX, axisStartY - offset.y));
                        break;

                    case LabelStyle.Position.Middle:

                        label = ChartHelper.AddChartLabel(s_DefaultAxisName, axisObj.transform, axis.axisName.labelStyle,
                                                          chart.theme.axis, axis.axisName.name, autoColor, TextAnchor.MiddleCenter);
                        label.SetActive(axis.axisName.labelStyle.show);
                        label.SetPosition(axis.position == Axis.AxisPosition.Right ?
                                          new Vector2(axisStartX + relativedLength - offset.x + axis.offset, axisStartY + axisLength / 2 + offset.y) :
                                          new Vector2(posX, axisStartY + axisLength / 2 + offset.y));
                        break;

                    default:
                        //LabelStyle.Position
                        label = ChartHelper.AddChartLabel(s_DefaultAxisName, axisObj.transform, axis.axisName.labelStyle,
                                                          chart.theme.axis, axis.axisName.name, autoColor, TextAnchor.MiddleCenter);
                        label.SetActive(axis.axisName.labelStyle.show);
                        label.SetPosition(axis.position == Axis.AxisPosition.Right ?
                                          new Vector2(axisStartX + relativedLength + offset.x + axis.offset, axisStartY + axisLength + offset.y) :
                                          new Vector2(posX, axisStartY + axisLength + offset.y));
                        break;
                    }
                }
            }
        }