private void DrawPieLabelBackground(VertexHelper vh, Serie serie)
 {
     if (serie.avoidLabelOverlap)
     {
         return;
     }
     foreach (var serieData in serie.data)
     {
         var serieLabel = SerieHelper.GetSerieLabel(serie, serieData);
         if (SerieLabelHelper.CanShowLabel(serie, serieData, serieLabel, 1))
         {
             SerieLabelHelper.UpdatePieLabelPosition(serie, serieData);
             chart.DrawLabelBackground(vh, serie, serieData);
         }
     }
 }
示例#2
0
 private void DrawLabelBackground(VertexHelper vh)
 {
     foreach (var serie in m_Series.list)
     {
         if (serie.type != SerieType.Pie)
         {
             continue;
         }
         foreach (var serieData in serie.data)
         {
             var serieLabel = SerieHelper.GetSerieLabel(serie, serieData);
             if (SerieLabelHelper.CanShowLabel(serie, serieData, serieLabel, 1))
             {
                 SerieLabelHelper.UpdatePieLabelPosition(serie, serieData);
                 DrawLabelBackground(vh, serie, serieData);
             }
         }
     }
 }
        private void UpdateRuntimeData(Serie serie)
        {
            var data = serie.data;

            serie.runtimeDataMax      = serie.yMax;
            serie.runtimePieDataTotal = serie.yTotal;

            SerieHelper.UpdateCenter(serie, chart.chartPosition, chart.chartWidth, chart.chartHeight);
            float totalDegree      = 0;
            float startDegree      = 0;
            float zeroReplaceValue = 0;
            int   showdataCount    = 0;

            foreach (var sd in serie.data)
            {
                if (sd.show && serie.pieRoseType == RoseType.Area)
                {
                    showdataCount++;
                }
                sd.canShowLabel = false;
            }
            float dataChangeDuration      = serie.animation.GetUpdateAnimationDuration();
            bool  isAllZeroValue          = SerieHelper.IsAllZeroValue(serie, 1);
            var   dataTotalFilterMinAngle = serie.runtimePieDataTotal;

            if (isAllZeroValue)
            {
                totalDegree               = 360;
                zeroReplaceValue          = totalDegree / data.Count;
                serie.runtimeDataMax      = zeroReplaceValue;
                serie.runtimePieDataTotal = 360;
            }
            else
            {
                dataTotalFilterMinAngle = GetTotalAngle(serie, serie.runtimePieDataTotal, ref totalDegree);
            }
            serie.animation.InitProgress(data.Count, 0, 360);
            for (int n = 0; n < data.Count; n++)
            {
                var serieData = data[n];
                serieData.index = n;
                float value = isAllZeroValue ? zeroReplaceValue : serieData.GetCurrData(1, dataChangeDuration);
                serieData.runtimePieStartAngle = startDegree;
                serieData.runtimePieToAngle    = startDegree;
                serieData.runtimePieHalfAngle  = startDegree;
                serieData.runtimePieCurrAngle  = startDegree;
                if (!serieData.show)
                {
                    continue;
                }
                float degree = serie.pieRoseType == RoseType.Area
                    ? (totalDegree / showdataCount)
                    : (totalDegree * value / dataTotalFilterMinAngle);
                if (serie.minAngle > 0 && degree < serie.minAngle)
                {
                    degree = serie.minAngle;
                }
                serieData.runtimePieToAngle       = startDegree + degree;
                serieData.runtimePieOutsideRadius = serie.pieRoseType > 0 ?
                                                    serie.runtimeInsideRadius +
                                                    (serie.runtimeOutsideRadius - serie.runtimeInsideRadius) * value / serie.runtimeDataMax :
                                                    serie.runtimeOutsideRadius;
                if (serieData.highlighted)
                {
                    serieData.runtimePieOutsideRadius += chart.theme.serie.pieTooltipExtraRadius;
                }
                var offset = 0f;
                if (serie.pieClickOffset && serieData.selected)
                {
                    offset += chart.theme.serie.pieSelectedOffset;
                }
                if (serie.animation.CheckDetailBreak(serieData.runtimePieToAngle))
                {
                    serieData.runtimePieCurrAngle = serie.animation.GetCurrDetail();
                }
                else
                {
                    serieData.runtimePieCurrAngle = serieData.runtimePieToAngle;
                }
                var halfDegree = (serieData.runtimePieToAngle - startDegree) / 2;
                serieData.runtimePieHalfAngle    = startDegree + halfDegree;
                serieData.runtiemPieOffsetCenter = serie.runtimeCenterPos;
                serieData.runtimePieInsideRadius = serie.runtimeInsideRadius;
                if (offset > 0)
                {
                    var currRad = serieData.runtimePieHalfAngle * Mathf.Deg2Rad;
                    var currSin = Mathf.Sin(currRad);
                    var currCos = Mathf.Cos(currRad);
                    serieData.runtimePieOffsetRadius   = 0;
                    serieData.runtimePieInsideRadius  -= serieData.runtimePieOffsetRadius;
                    serieData.runtimePieOutsideRadius -= serieData.runtimePieOffsetRadius;
                    if (serie.pieClickOffset && serieData.selected)
                    {
                        serieData.runtimePieOffsetRadius += chart.theme.serie.pieSelectedOffset;
                        if (serieData.runtimePieInsideRadius > 0)
                        {
                            serieData.runtimePieInsideRadius += chart.theme.serie.pieSelectedOffset;
                        }
                        serieData.runtimePieOutsideRadius += chart.theme.serie.pieSelectedOffset;
                    }
                    serieData.runtiemPieOffsetCenter = new Vector3(
                        serie.runtimeCenterPos.x + serieData.runtimePieOffsetRadius * currSin,
                        serie.runtimeCenterPos.y + serieData.runtimePieOffsetRadius * currCos);
                }
                serieData.canShowLabel = serieData.runtimePieCurrAngle >= serieData.runtimePieHalfAngle;
                startDegree            = serieData.runtimePieToAngle;
                SerieLabelHelper.UpdatePieLabelPosition(serie, serieData);
            }
            SerieLabelHelper.AvoidLabelOverlap(serie);
        }
示例#4
0
        private void DrawLabel(Serie serie, int dataIndex, SerieData serieData, Color serieColor)
        {
            if (serieData.labelObject == null)
            {
                return;
            }
            var currAngle   = serieData.runtimePieHalfAngle;
            var isHighlight = (serieData.highlighted && serie.emphasis.label.show);
            var serieLabel  = SerieHelper.GetSerieLabel(serie, serieData);
            var showLabel   = ((serieLabel.show || isHighlight) && serieData.canShowLabel);

            if (showLabel || serieData.iconStyle.show)
            {
                serieData.SetLabelActive(showLabel);
                float rotate           = 0;
                bool  isInsidePosition = serieLabel.position == SerieLabel.Position.Inside;
                if (serieLabel.rotate > 0 && isInsidePosition)
                {
                    if (currAngle > 180)
                    {
                        rotate += 270 - currAngle;
                    }
                    else
                    {
                        rotate += -(currAngle - 90);
                    }
                }
                Color color = serieColor;
                if (isHighlight)
                {
                    if (!ChartHelper.IsClearColor(serie.emphasis.label.color))
                    {
                        color = serie.emphasis.label.color;
                    }
                }
                else if (!ChartHelper.IsClearColor(serieLabel.color))
                {
                    color = serieLabel.color;
                }
                else
                {
                    color = isInsidePosition ? Color.white : serieColor;
                }
                var fontSize  = isHighlight ? serie.emphasis.label.fontSize : serieLabel.fontSize;
                var fontStyle = isHighlight ? serie.emphasis.label.fontStyle : serieLabel.fontStyle;

                serieData.labelObject.label.color     = color;
                serieData.labelObject.label.fontSize  = fontSize;
                serieData.labelObject.label.fontStyle = fontStyle;
                serieData.labelObject.SetLabelRotate(rotate);
                SerieLabelHelper.UpdatePieLabelPosition(serie, serieData);
                if (!string.IsNullOrEmpty(serieLabel.formatter))
                {
                    var value   = serieData.data[1];
                    var total   = serie.yTotal;
                    var content = SerieLabelHelper.GetFormatterContent(serie, serieData, value, total, serieLabel);
                    if (serieData.labelObject.SetText(content))
                    {
                        RefreshChart();
                    }
                }
                else
                {
                    if (serieData.labelObject.SetText(serieData.name))
                    {
                        RefreshChart();
                    }
                }
                serieData.labelObject.SetPosition(SerieLabelHelper.GetRealLabelPosition(serieData, serieLabel));
                if (showLabel)
                {
                    serieData.labelObject.SetLabelPosition(serieLabel.offset);
                }
                else
                {
                    serieData.SetLabelActive(false);
                }
            }
            else
            {
                serieData.SetLabelActive(false);
            }
            serieData.labelObject.UpdateIcon(serieData.iconStyle);
        }