10 using System.Collections.Generic;
17 public partial class CoordinateChart : BaseChart
19 private static readonly
string s_DefaultDataZoom =
"datazoom";
20 private static readonly
string s_DefaultAxisName =
"name";
22 protected override void InitComponent()
25 if (m_Grids.Count == 0) m_Grids =
new List<Grid>() { Grid.defaultGrid };
26 if (m_DataZooms.Count == 0) m_DataZooms =
new List<DataZoom>() { DataZoom.defaultDataZoom };
27 if (m_VisualMaps.Count == 0) m_VisualMaps =
new List<VisualMap> {
new VisualMap() };
34 tooltip.UpdateToTop();
36 var handler =
new MarkLineHandler(
this);
37 m_ComponentHandlers.Add(handler);
41 protected override void Update()
49 protected override void Reset()
61 private void RefreshSeriePainterByGridIndex(
int gridIndex)
63 foreach (var serie
in m_Series.list)
65 var axis = GetXAxis(serie.xAxisIndex);
66 if (axis ==
null)
continue;
67 var
grid = GetGrid(axis.index);
68 if (
grid ==
null)
continue;
69 if (
grid.index == gridIndex)
71 RefreshPainter(serie);
76 private void RefreshSeriePainterByAxisIndex(Axis axis)
78 var
grid = GetGrid(axis.index);
79 if (
grid ==
null)
return;
80 RefreshSeriePainterByGridIndex(
grid.index);
83 public override void OnDataZoomRangeChanged(DataZoom dataZoom)
85 foreach (var index
in dataZoom.xAxisIndexs)
87 var axis = GetXAxis(index);
88 if (axis !=
null && axis.show) axis.SetAllDirty();
90 foreach (var index
in dataZoom.yAxisIndexs)
92 var axis = GetYAxis(index);
93 if (axis !=
null && axis.show) axis.SetAllDirty();
97 protected override void DrawPainterBase(VertexHelper vh)
99 base.DrawPainterBase(vh);
100 if (!SeriesHelper.IsAnyClipSerie(m_Series))
106 protected override void DrawBackground(VertexHelper vh)
108 if (SeriesHelper.IsAnyClipSerie(m_Series))
112 var xSplitDiff =
xAxis0.
splitLine.GetWidth(m_Theme.axis.splitLineWidth);
113 var ySplitDiff =
yAxis0.
splitLine.GetWidth(m_Theme.axis.splitLineWidth);
114 foreach (var
grid in m_Grids)
116 var cpty =
grid.runtimeY +
grid.runtimeHeight + ySplitDiff;
117 var cp1 =
new Vector3(
grid.runtimeX - yLineDiff,
grid.runtimeY - xLineDiff);
118 var cp2 =
new Vector3(
grid.runtimeX - yLineDiff, cpty);
119 var cp3 =
new Vector3(
grid.runtimeX +
grid.runtimeWidth + xSplitDiff, cpty);
120 var cp4 =
new Vector3(
grid.runtimeX +
grid.runtimeWidth + xSplitDiff,
grid.runtimeY - xLineDiff);
121 var backgroundColor = ThemeHelper.GetBackgroundColor(m_Theme, m_Background);
122 UGL.DrawQuadrilateral(vh, cp1, cp2, cp3, cp4, backgroundColor);
127 base.DrawBackground(vh);
131 protected void DrawClip(VertexHelper vh)
133 if (!SeriesHelper.IsAnyClipSerie(m_Series))
return;
136 var xSplitDiff =
xAxis0.
splitLine.GetWidth(m_Theme.axis.splitLineWidth);
137 var ySplitDiff =
yAxis0.
splitLine.GetWidth(m_Theme.axis.splitLineWidth);
138 var backgroundColor = ThemeHelper.GetBackgroundColor(m_Theme, m_Background);
139 var lp1 =
new Vector3(m_ChartX, m_ChartY);
140 var lp2 =
new Vector3(m_ChartX, m_ChartY + chartHeight);
141 var lp3 =
new Vector3(
grid.runtimeX - yLineDiff, m_ChartY + chartHeight);
142 var lp4 =
new Vector3(
grid.runtimeX - yLineDiff, m_ChartY);
143 UGL.DrawQuadrilateral(vh, lp1, lp2, lp3, lp4, backgroundColor);
144 var rp1 =
new Vector3(
grid.runtimeX +
grid.runtimeWidth, m_ChartY);
145 var rp2 =
new Vector3(
grid.runtimeX +
grid.runtimeWidth, m_ChartY + chartHeight);
146 var rp3 =
new Vector3(m_ChartX + chartWidth, m_ChartY + chartHeight);
147 var rp4 =
new Vector3(m_ChartX + chartWidth, m_ChartY);
148 UGL.DrawQuadrilateral(vh, rp1, rp2, rp3, rp4, backgroundColor);
149 var up1 =
new Vector3(
grid.runtimeX - yLineDiff,
grid.runtimeY +
grid.runtimeHeight + ySplitDiff);
150 var up2 =
new Vector3(
grid.runtimeX - yLineDiff, m_ChartY + chartHeight);
151 var up3 =
new Vector3(
grid.runtimeX +
grid.runtimeWidth + xSplitDiff, m_ChartY + chartHeight);
152 var up4 =
new Vector3(
grid.runtimeX +
grid.runtimeWidth + xSplitDiff,
153 grid.runtimeY +
grid.runtimeHeight + ySplitDiff);
154 UGL.DrawQuadrilateral(vh, up1, up2, up3, up4, backgroundColor);
155 var dp1 =
new Vector3(
grid.runtimeX - yLineDiff, m_ChartY);
156 var dp2 =
new Vector3(
grid.runtimeX - yLineDiff,
grid.runtimeY - xLineDiff);
157 var dp3 =
new Vector3(
grid.runtimeX +
grid.runtimeWidth + xSplitDiff,
grid.runtimeY - xLineDiff);
158 var dp4 =
new Vector3(
grid.runtimeX +
grid.runtimeWidth + xSplitDiff, m_ChartY);
159 UGL.DrawQuadrilateral(vh, dp1, dp2, dp3, dp4, backgroundColor);
162 protected override void DrawPainterSerie(VertexHelper vh, Serie serie)
164 base.DrawPainterSerie(vh, serie);
165 var colorIndex = m_LegendRealShowName.IndexOf(serie.legendName);
166 bool yCategory = IsAnyYAxisIsCategory();
170 serie.dataPoints.Clear();
171 if (yCategory) DrawYLineSerie(vh, serie, colorIndex);
172 else DrawXLineSerie(vh, serie, colorIndex);
173 if (!SeriesHelper.IsStack(m_Series))
175 DrawLinePoint(vh, serie);
176 DrawLineArrow(vh, serie);
180 serie.dataPoints.Clear();
181 if (yCategory) DrawYBarSerie(vh, serie, colorIndex);
182 else DrawXBarSerie(vh, serie, colorIndex);
186 serie.dataPoints.Clear();
187 DrawScatterSerie(vh, colorIndex, serie);
190 serie.dataPoints.Clear();
191 DrawHeatmapSerie(vh, colorIndex, serie);
194 serie.dataPoints.Clear();
195 DrawCandlestickSerie(vh, colorIndex, serie);
200 protected override void DrawPainterTop(VertexHelper vh)
203 if (SeriesHelper.IsAnyClipSerie(m_Series))
208 DrawLabelBackground(vh);
209 if (SeriesHelper.IsStack(m_Series))
211 foreach (var serie
in m_Series.list)
213 DrawLinePoint(vh, serie);
214 DrawLineArrow(vh, serie);
217 bool yCategory = IsAnyYAxisIsCategory();
218 if (yCategory) DrawYTooltipIndicator(vh);
219 else DrawXTooltipIndicator(vh);
222 protected override void CheckTootipArea(Vector2 local,
bool isActivedOther)
226 foreach (var axis
in m_XAxes) axis.SetTooltipLabelActive(
false);
227 foreach (var axis
in m_YAxes) axis.SetTooltipLabelActive(
false);
230 var
grid = GetGrid(local);
233 tooltip.runtimeGridIndex = -1;
234 tooltip.ClearValue();
239 if (tooltip.runtimeGridIndex !=
grid.index)
241 tooltip.runtimeGridIndex =
grid.index;
242 RefreshSeriePainterByGridIndex(
grid.index);
244 UpdateTooltipValue(local);
246 if (tooltip.IsSelected())
248 tooltip.UpdateContentPos(local + tooltip.offset);
250 if (tooltip.IsDataIndexChanged() || tooltip.type == Tooltip.Type.Corss)
252 tooltip.UpdateLastDataIndex();
253 m_PainterTop.Refresh();
256 else if (tooltip.IsActive())
258 tooltip.SetActive(
false);
259 m_PainterTop.Refresh();
263 protected virtual void UpdateTooltipValue(Vector2 local)
266 var
grid = GetGrid(tooltip.runtimeGridIndex);
267 for (
int i = 0; i < m_XAxes.Count; i++)
269 var xAxis = m_XAxes[i];
270 var yAxis = m_YAxes[i];
271 if (!xAxis.show && !yAxis.show)
continue;
272 if (isCartesian && xAxis.show && yAxis.show)
274 var yRate = (yAxis.runtimeMaxValue - yAxis.runtimeMinValue) /
grid.runtimeHeight;
275 var xRate = (xAxis.runtimeMaxValue - xAxis.runtimeMinValue) /
grid.runtimeWidth;
276 var yValue = yRate * (local.y -
grid.runtimeY - yAxis.runtimeZeroYOffset);
277 if (yAxis.runtimeMinValue > 0) yValue += yAxis.runtimeMinValue;
278 tooltip.runtimeYValues[i] = yValue;
279 var xValue = xRate * (local.x -
grid.runtimeX - xAxis.runtimeZeroXOffset);
280 if (xAxis.runtimeMinValue > 0) xValue += xAxis.runtimeMinValue;
281 tooltip.runtimeXValues[i] = xValue;
283 for (
int j = 0; j < m_Series.Count; j++)
285 var serie = m_Series.GetSerie(j);
286 for (
int n = 0; n < serie.data.Count; n++)
288 var serieData = serie.data[n];
289 var xdata = serieData.GetData(0, xAxis.inverse);
290 var ydata = serieData.GetData(1, yAxis.inverse);
291 var symbol = SerieHelper.GetSerieSymbol(serie, serieData);
292 var symbolSize = symbol.GetSize(serieData ==
null ?
null : serieData.data,
293 m_Theme.serie.lineSymbolSize);
294 if (Math.Abs(xValue - xdata) / xRate < symbolSize
295 && Math.Abs(yValue - ydata) / yRate < symbolSize)
297 tooltip.runtimeDataIndex[i] = n;
298 RefreshPainter(serie);
299 serieData.highlighted =
true;
303 serieData.highlighted =
false;
310 var dataZoomX = DataZoomHelper.GetAxisRelatedDataZoom(xAxis, dataZooms);
311 var dataCount = m_Series.list.Count > 0 ? m_Series.list[0].GetDataList(dataZoomX).Count : 0;
312 for (
int j = 0; j < xAxis.GetDataNumber(dataZoomX); j++)
314 float splitWid = AxisHelper.GetDataWidth(xAxis,
grid.runtimeWidth, dataCount, dataZoomX);
315 float pX =
grid.runtimeX + j * splitWid;
316 if ((xAxis.boundaryGap && (local.x > pX && local.x <= pX + splitWid)) ||
317 (!xAxis.boundaryGap && (local.x > pX - splitWid / 2 && local.x <= pX + splitWid / 2)))
319 tooltip.runtimeXValues[i] = j;
320 tooltip.runtimeDataIndex[i] = j;
324 var dataZoomY = DataZoomHelper.GetAxisRelatedDataZoom(yAxis, dataZooms);
325 dataCount = m_Series.list.Count > 0 ? m_Series.list[0].GetDataList(dataZoomY).Count : 0;
326 for (
int j = 0; j < yAxis.GetDataNumber(dataZoomY); j++)
328 float splitWid = AxisHelper.GetDataWidth(yAxis,
grid.runtimeHeight, dataCount, dataZoomY);
329 float pY =
grid.runtimeY + j * splitWid;
330 if ((yAxis.boundaryGap && (local.y > pY && local.y <= pY + splitWid)) ||
331 (!yAxis.boundaryGap && (local.y > pY - splitWid / 2 && local.y <= pY + splitWid / 2)))
333 tooltip.runtimeYValues[i] = j;
338 else if (xAxis.IsCategory())
340 var dataZoom = DataZoomHelper.GetAxisRelatedDataZoom(xAxis, dataZooms);
341 var dataCount = m_Series.list.Count > 0 ? m_Series.list[0].GetDataList(dataZoom).Count : 0;
342 var value = (yAxis.runtimeMaxValue - yAxis.runtimeMinValue) * (local.y -
grid.runtimeY - yAxis.runtimeZeroYOffset) /
grid.runtimeHeight;
343 if (yAxis.runtimeMinValue > 0) value += yAxis.runtimeMinValue;
344 tooltip.runtimeYValues[i] = value;
345 for (
int j = 0; j < xAxis.GetDataNumber(dataZoom); j++)
347 float splitWid = AxisHelper.GetDataWidth(xAxis,
grid.runtimeWidth, dataCount, dataZoom);
348 float pX =
grid.runtimeX + j * splitWid;
349 if ((xAxis.boundaryGap && (local.x > pX && local.x <= pX + splitWid)) ||
350 (!xAxis.boundaryGap && (local.x > pX - splitWid / 2 && local.x <= pX + splitWid / 2)))
352 tooltip.runtimeXValues[i] = j;
353 tooltip.runtimeDataIndex[i] = j;
354 RefreshSeriePainterByAxisIndex(xAxis);
359 else if (yAxis.IsCategory())
361 var dataZoom = DataZoomHelper.GetAxisRelatedDataZoom(yAxis, dataZooms);
362 var dataCount = m_Series.list.Count > 0 ? m_Series.list[0].GetDataList(dataZoom).Count : 0;
363 var value = (xAxis.runtimeMaxValue - xAxis.runtimeMinValue) * (local.x -
grid.runtimeX - xAxis.runtimeZeroXOffset) /
grid.runtimeWidth;
364 if (xAxis.runtimeMinValue > 0) value += xAxis.runtimeMinValue;
365 tooltip.runtimeXValues[i] = value;
366 for (
int j = 0; j < yAxis.GetDataNumber(dataZoom); j++)
368 float splitWid = AxisHelper.GetDataWidth(yAxis,
grid.runtimeHeight, dataCount, dataZoom);
369 float pY =
grid.runtimeY + j * splitWid;
370 if ((yAxis.boundaryGap && (local.y > pY && local.y <= pY + splitWid)) ||
371 (!yAxis.boundaryGap && (local.y > pY - splitWid / 2 && local.y <= pY + splitWid / 2)))
373 tooltip.runtimeYValues[i] = j;
374 tooltip.runtimeDataIndex[i] = j;
375 RefreshSeriePainterByAxisIndex(yAxis);
383 protected StringBuilder sb =
new StringBuilder(100);
384 protected override void UpdateTooltip()
386 base.UpdateTooltip();
392 index = tooltip.runtimeDataIndex[0];
393 tempAxis = m_XAxes[0];
395 else if (m_XAxes[0].type == Axis.AxisType.Value)
397 index = (int)tooltip.runtimeYValues[0];
398 tempAxis = m_YAxes[0];
402 index = (int)tooltip.runtimeXValues[0];
403 tempAxis = m_XAxes[0];
407 if (tooltip.IsActive())
409 tooltip.SetActive(
false);
414 UpdateSerieGridIndex();
415 RefreshSeriePainterByGridIndex(
grid.index);
416 var dataZoom = DataZoomHelper.GetAxisRelatedDataZoom(tempAxis, dataZooms);
417 var content = TooltipHelper.GetFormatterContent(tooltip, index,
this, dataZoom, isCartesian);
418 TooltipHelper.SetContentAndPosition(tooltip, content, chartRect);
419 tooltip.SetActive(
true);
421 for (
int i = 0; i < m_XAxes.Count; i++)
423 UpdateAxisTooltipLabel(i, m_XAxes[i]);
425 for (
int i = 0; i < m_YAxes.Count; i++)
427 UpdateAxisTooltipLabel(i, m_YAxes[i]);
431 internal string GetTooltipCategory(
int dataIndex, DataZoom dataZoom =
null)
438 index = tooltip.runtimeDataIndex[0];
439 tempAxis = m_XAxes[0];
441 else if (m_XAxes[0].type == Axis.AxisType.Value)
443 index = (int)tooltip.runtimeYValues[0];
444 tempAxis = m_YAxes[0];
448 index = (int)tooltip.runtimeXValues[0];
449 tempAxis = m_XAxes[0];
451 return tempAxis.GetData(index, dataZoom);
453 internal string GetTooltipCategory(
int dataIndex, Serie serie, DataZoom dataZoom =
null)
460 index = tooltip.runtimeDataIndex[0];
461 tempAxis = GetXAxis(serie.xAxisIndex);
463 else if (m_XAxes[0].type == Axis.AxisType.Value)
465 index = (int)tooltip.runtimeYValues[0];
466 tempAxis = GetYAxis(serie.yAxisIndex);
470 index = (int)tooltip.runtimeXValues[0];
471 tempAxis = GetXAxis(serie.xAxisIndex);
473 return tempAxis ==
null ?
"" : tempAxis.
GetData(index, dataZoom);
476 protected void UpdateAxisTooltipLabel(
int axisIndex, Axis axis)
478 var showTooltipLabel = axis.show && tooltip.type == Tooltip.Type.Corss;
479 axis.SetTooltipLabelActive(showTooltipLabel);
480 if (!showTooltipLabel)
return;
482 var labelPos = Vector2.zero;
483 var
grid = GetAxisGridOrDefault(axis);
484 var dataZoom = DataZoomHelper.GetAxisRelatedDataZoom(axis, dataZooms);
487 var posY = axisIndex > 0 ?
grid.runtimeY +
grid.runtimeHeight :
grid.runtimeY;
488 var diff = axisIndex > 0
489 ? -axis.axisLabel.textStyle.GetFontSize(m_Theme.tooltip) - axis.axisLabel.margin - 3.5f
490 : axis.axisLabel.margin / 2 + 1;
493 labelText = ChartCached.NumberToStr(tooltip.runtimeXValues[axisIndex], axis.axisLabel.numericFormatter);
494 labelPos =
new Vector2(tooltip.runtimePointerPos.x, posY - diff);
498 labelText = axis.GetData((
int)tooltip.runtimeXValues[axisIndex], dataZoom);
499 var splitWidth = AxisHelper.GetDataWidth(axis,
grid.runtimeWidth, 0, dataZoom);
500 var index = (int)tooltip.runtimeXValues[axisIndex];
501 var px =
grid.runtimeX + index * splitWidth + (axis.boundaryGap ? splitWidth / 2 : 0);
502 labelPos =
new Vector2(px, posY - diff);
505 else if (axis is YAxis)
507 var posX = axisIndex > 0 ?
grid.runtimeX +
grid.runtimeWidth :
grid.runtimeX;
508 var diff = axisIndex > 0 ? -axis.axisLabel.margin + 3 : axis.axisLabel.margin - 3;
511 labelText = ChartCached.NumberToStr(tooltip.runtimeYValues[axisIndex], axis.axisLabel.numericFormatter);
512 labelPos =
new Vector2(posX - diff, tooltip.runtimePointerPos.y);
516 labelText = axis.GetData((
int)tooltip.runtimeYValues[axisIndex], dataZoom);
517 var splitWidth = AxisHelper.GetDataWidth(axis,
grid.runtimeHeight, 0, dataZoom);
518 var index = (int)tooltip.runtimeYValues[axisIndex];
519 var py =
grid.runtimeY + index * splitWidth + (axis.boundaryGap ? splitWidth / 2 : 0);
520 labelPos =
new Vector2(posX - diff, py);
523 axis.UpdateTooptipLabelText(labelText);
524 axis.UpdateTooltipLabelPos(labelPos);
527 private void InitDefaultAxes()
529 if (m_XAxes.Count <= 0)
531 var axis1 = XAxis.defaultXAxis;
532 var axis2 = XAxis.defaultXAxis;
535 axis1.position = Axis.AxisPosition.Bottom;
536 axis2.position = Axis.AxisPosition.Top;
540 if (m_YAxes.Count <= 0)
542 var axis1 = YAxis.defaultYAxis;
543 var axis2 = YAxis.defaultYAxis;
545 axis1.splitNumber = 5;
546 axis1.boundaryGap =
false;
548 axis1.position = Axis.AxisPosition.Left;
549 axis2.position = Axis.AxisPosition.Right;
553 foreach (var axis
in m_XAxes) axis.runtimeMinValue = axis.runtimeMaxValue = 0;
554 foreach (var axis
in m_YAxes) axis.runtimeMinValue = axis.runtimeMaxValue = 0;
557 private void InitAxisY()
559 for (
int i = 0; i < m_YAxes.Count; i++)
561 InitYAxis(i, m_YAxes[i]);
565 private void InitYAxis(
int yAxisIndex, YAxis yAxis)
567 yAxis.painter = m_Painter;
568 yAxis.refreshComponent = delegate ()
570 InitAxisRuntimeData(yAxis);
571 string objName = ChartCached.GetYAxisName(yAxisIndex);
572 var axisObj = ChartHelper.AddObject(objName, transform, graphAnchorMin,
573 graphAnchorMax, chartPivot,
new Vector2(chartWidth, chartHeight));
574 yAxis.gameObject = axisObj;
575 yAxis.runtimeAxisLabelList.Clear();
576 axisObj.SetActive(yAxis.show);
577 axisObj.hideFlags = chartHideFlags;
578 ChartHelper.HideAllObject(axisObj);
579 var
grid = GetAxisGridOrDefault(yAxis);
580 if (
grid ==
null)
return;
581 if (!yAxis.show)
return;
582 var dataZoom = DataZoomHelper.GetAxisRelatedDataZoom(yAxis, dataZooms);
583 var axisLabelTextStyle = yAxis.axisLabel.textStyle;
584 int splitNumber = AxisHelper.GetScaleNumber(yAxis,
grid.runtimeHeight, dataZoom);
585 float totalWidth = 0;
586 float eachWidth = AxisHelper.GetEachWidth(yAxis,
grid.runtimeHeight, dataZoom);
587 float gapWidth = yAxis.boundaryGap ? eachWidth / 2 : 0;
588 float textWidth = yAxis.axisLabel.width > 0
589 ? yAxis.axisLabel.width
591 float textHeight = yAxis.axisLabel.height > 0
592 ? yAxis.axisLabel.height
594 if (yAxis.IsCategory() && yAxis.boundaryGap)
598 for (
int i = 0; i < splitNumber; i++)
601 var inside = yAxis.axisLabel.inside;
602 var isPercentStack = SeriesHelper.IsPercentStack(m_Series,
SerieType.Bar);
603 var labelName = AxisHelper.GetLabelName(yAxis,
grid.runtimeHeight, i, yAxis.runtimeMinValue,
604 yAxis.runtimeMaxValue, dataZoom, isPercentStack);
605 if ((inside && yAxis.IsLeft()) || (!inside && yAxis.IsRight()))
607 txt = ChartHelper.AddAxisLabelObject(splitNumber, i, objName + i, axisObj.transform, Vector2.zero,
608 Vector2.zero,
new Vector2(0, 0.5f),
new Vector2(textWidth, textHeight), yAxis, theme.axis,
610 txt.label.SetAlignment(axisLabelTextStyle.GetAlignment(TextAnchor.MiddleLeft));
614 txt = ChartHelper.AddAxisLabelObject(splitNumber, i, objName + i, axisObj.transform, Vector2.zero,
615 Vector2.zero,
new Vector2(1, 0.5f),
new Vector2(textWidth, textHeight), yAxis, theme.axis,
617 txt.label.SetAlignment(axisLabelTextStyle.GetAlignment(TextAnchor.MiddleRight));
619 var labelWidth = AxisHelper.GetScaleWidth(yAxis,
grid.runtimeHeight, i + 1, dataZoom);
620 if (i == 0) yAxis.axisLabel.SetRelatedText(txt.label, labelWidth);
621 txt.SetPosition(GetLabelYPosition(totalWidth + gapWidth, i, yAxisIndex, yAxis));
622 yAxis.runtimeAxisLabelList.Add(txt);
623 totalWidth += labelWidth;
625 if (yAxis.axisName.show)
627 var axisNameTextStyle = yAxis.axisName.textStyle;
628 var offset = axisNameTextStyle.offset;
629 ChartText axisName =
null;
630 var xAxis = GetXAxis(yAxisIndex);
631 var zeroPos =
new Vector3(
grid.runtimeX + (xAxis ==
null ? 0 : xAxis.runtimeZeroXOffset),
grid.runtimeY);
632 switch (yAxis.axisName.location)
634 case AxisName.Location.Start:
635 axisName = ChartHelper.AddTextObject(s_DefaultAxisName, axisObj.transform,
new Vector2(0.5f, 0.5f),
636 new Vector2(0.5f, 0.5f),
new Vector2(0.5f, 0.5f),
new Vector2(100, 20), axisNameTextStyle,
638 axisName.SetAlignment(axisNameTextStyle.GetAlignment(TextAnchor.MiddleCenter));
639 axisName.SetLocalPosition(yAxis.position == Axis.AxisPosition.Right ?
640 new Vector2(
grid.runtimeX +
grid.runtimeWidth + offset.x + yAxis.offset,
grid.runtimeY - offset.y) :
641 new Vector2(zeroPos.x + offset.x + yAxis.offset,
grid.runtimeY - offset.y));
643 case AxisName.Location.Middle:
644 axisName = ChartHelper.AddTextObject(s_DefaultAxisName, axisObj.transform,
new Vector2(1, 0.5f),
645 new Vector2(1, 0.5f),
new Vector2(1, 0.5f),
new Vector2(100, 20), axisNameTextStyle,
647 axisName.SetAlignment(axisNameTextStyle.GetAlignment(TextAnchor.MiddleRight));
648 axisName.SetLocalPosition(yAxis.position == Axis.AxisPosition.Right ?
649 new Vector2(
grid.runtimeX +
grid.runtimeWidth - offset.x + yAxis.offset,
grid.runtimeY +
grid.runtimeHeight / 2 + offset.y) :
650 new Vector2(
grid.runtimeX - offset.x + yAxis.offset,
grid.runtimeY +
grid.runtimeHeight / 2 + offset.y));
652 case AxisName.Location.End:
653 axisName = ChartHelper.AddTextObject(s_DefaultAxisName, axisObj.transform,
new Vector2(0.5f, 0.5f),
654 new Vector2(0.5f, 0.5f),
new Vector2(0.5f, 0.5f),
new Vector2(100, 20), axisNameTextStyle,
656 axisName.SetAlignment(axisNameTextStyle.GetAlignment(TextAnchor.MiddleCenter));
657 axisName.SetLocalPosition(yAxis.position == Axis.AxisPosition.Right ?
658 new Vector2(
grid.runtimeX +
grid.runtimeWidth + offset.x + yAxis.offset,
grid.runtimeY +
grid.runtimeHeight + offset.y) :
659 new Vector2(zeroPos.x + offset.x + yAxis.offset,
grid.runtimeY +
grid.runtimeHeight + offset.y));
662 axisName.SetText(yAxis.axisName.name);
665 if (tooltip.runtimeGameObject)
667 Vector2 privot = yAxis.position == Axis.AxisPosition.Right ?
new Vector2(0, 0.5f) : new Vector2(1, 0.5f);
668 var labelParent = tooltip.runtimeGameObject.transform;
669 var labelName = ChartCached.GetAxisTooltipLabel(objName);
670 GameObject labelObj = ChartHelper.AddTooltipLabel(labelName, labelParent, m_Theme, privot);
671 yAxis.SetTooltipLabel(labelObj);
672 yAxis.SetTooltipLabelColor(m_Theme.tooltip.labelBackgroundColor, m_Theme.tooltip.labelTextColor);
673 yAxis.SetTooltipLabelActive(yAxis.show && tooltip.show && tooltip.type == Tooltip.Type.Corss);
676 yAxis.refreshComponent();
679 protected virtual void InitAxisRuntimeData(Axis axis)
683 internal void InitAxisX()
685 for (
int i = 0; i < m_XAxes.Count; i++)
687 InitXAxis(i, m_XAxes[i]);
691 private void InitXAxis(
int xAxisIndex, XAxis xAxis)
693 xAxis.painter = m_Painter;
694 xAxis.refreshComponent = delegate ()
696 string objName = ChartCached.GetXAxisName(xAxisIndex);
697 var axisObj = ChartHelper.AddObject(objName, transform, graphAnchorMin,
698 graphAnchorMax, chartPivot,
new Vector2(chartWidth, chartHeight));
699 xAxis.gameObject = axisObj;
700 xAxis.runtimeAxisLabelList.Clear();
701 axisObj.SetActive(xAxis.show);
702 axisObj.hideFlags = chartHideFlags;
703 ChartHelper.HideAllObject(axisObj);
704 var
grid = GetAxisGridOrDefault(xAxis);
705 if (
grid ==
null)
return;
706 if (!xAxis.show)
return;
707 var axisLabelTextStyle = xAxis.axisLabel.textStyle;
708 var dataZoom = DataZoomHelper.GetAxisRelatedDataZoom(xAxis, dataZooms);
709 int splitNumber = AxisHelper.GetScaleNumber(xAxis,
grid.runtimeWidth, dataZoom);
710 float totalWidth = 0;
711 float eachWidth = AxisHelper.GetEachWidth(xAxis,
grid.runtimeWidth, dataZoom);
712 float gapWidth = xAxis.boundaryGap ? eachWidth / 2 : 0;
713 float textWidth = xAxis.axisLabel.width > 0
714 ? xAxis.axisLabel.width
715 : AxisHelper.GetScaleWidth(xAxis,
grid.runtimeWidth, 0, dataZoom);
716 float textHeight = xAxis.axisLabel.height > 0
717 ? xAxis.axisLabel.height
719 if (xAxis.IsCategory() && xAxis.boundaryGap)
723 for (
int i = 0; i < splitNumber; i++)
725 var labelWidth = AxisHelper.GetScaleWidth(xAxis,
grid.runtimeWidth, i + 1, dataZoom);
726 var inside = xAxis.axisLabel.inside;
727 var isPercentStack = SeriesHelper.IsPercentStack(m_Series,
SerieType.Bar);
728 var labelName = AxisHelper.GetLabelName(xAxis,
grid.runtimeWidth, i, xAxis.runtimeMinValue,
729 xAxis.runtimeMaxValue, dataZoom, isPercentStack);
730 var label = ChartHelper.AddAxisLabelObject(splitNumber, i, ChartCached.GetXAxisName(xAxisIndex, i),
731 axisObj.transform,
new Vector2(0.5f, 0.5f),
new Vector2(0.5f, 0.5f),
new Vector2(0.5f, 0.5f),
732 new Vector2(textWidth, textHeight), xAxis, theme.axis, labelName);
734 if (i == 0) xAxis.axisLabel.SetRelatedText(label.label, labelWidth);
735 label.label.SetAlignment(axisLabelTextStyle.GetAlignment(TextAnchor.MiddleCenter));
736 label.SetPosition(GetLabelXPosition(totalWidth + gapWidth, i, xAxisIndex, xAxis));
737 xAxis.runtimeAxisLabelList.Add(label);
738 totalWidth += labelWidth;
740 if (xAxis.axisName.show)
742 var axisNameTextStyle = xAxis.axisName.textStyle;
743 var offset = axisNameTextStyle.offset;
744 ChartText axisName =
null;
745 var yAxis = GetYAxis(xAxisIndex);
746 var zeroPos =
new Vector3(
grid.runtimeX,
grid.runtimeY + (yAxis ==
null ? 0 : yAxis.runtimeZeroYOffset));
747 switch (xAxis.axisName.location)
749 case AxisName.Location.Start:
750 axisName = ChartHelper.AddTextObject(s_DefaultAxisName, axisObj.transform,
new Vector2(1, 0.5f),
751 new Vector2(1, 0.5f),
new Vector2(1, 0.5f),
new Vector2(100, 20), axisNameTextStyle, theme.axis);
752 axisName.SetAlignment(axisNameTextStyle.GetAlignment(TextAnchor.MiddleRight));
753 axisName.SetLocalPosition(xAxis.position == Axis.AxisPosition.Top ?
754 new Vector2(zeroPos.x - offset.x,
grid.runtimeY +
grid.runtimeHeight + offset.y + xAxis.offset) :
755 new Vector2(zeroPos.x - offset.x, zeroPos.y + offset.y + xAxis.offset));
757 case AxisName.Location.Middle:
758 axisName = ChartHelper.AddTextObject(s_DefaultAxisName, axisObj.transform,
new Vector2(0.5f, 0.5f),
759 new Vector2(0.5f, 0.5f),
new Vector2(0.5f, 0.5f),
new Vector2(100, 20), axisNameTextStyle, theme.axis);
760 axisName.SetAlignment(axisNameTextStyle.GetAlignment(TextAnchor.MiddleCenter));
761 axisName.SetLocalPosition(xAxis.position == Axis.AxisPosition.Top ?
762 new Vector2(
grid.runtimeX +
grid.runtimeWidth / 2 + offset.x,
grid.runtimeY +
grid.runtimeHeight - offset.y + xAxis.offset) :
763 new Vector2(
grid.runtimeX +
grid.runtimeWidth / 2 + offset.x,
grid.runtimeY - offset.y + xAxis.offset));
765 case AxisName.Location.End:
766 axisName = ChartHelper.AddTextObject(s_DefaultAxisName, axisObj.transform,
new Vector2(0, 0.5f),
767 new Vector2(0, 0.5f),
new Vector2(0, 0.5f),
new Vector2(100, 20), axisNameTextStyle, theme.axis);
768 axisName.SetAlignment(axisNameTextStyle.GetAlignment(TextAnchor.MiddleLeft));
769 axisName.SetLocalPosition(xAxis.position == Axis.AxisPosition.Top ?
770 new Vector2(
grid.runtimeX +
grid.runtimeWidth + offset.x,
grid.runtimeY +
grid.runtimeHeight + offset.y + xAxis.offset) :
771 new Vector2(
grid.runtimeX +
grid.runtimeWidth + offset.x, zeroPos.y + offset.y + xAxis.offset));
774 axisName.SetText(xAxis.axisName.name);
776 if (tooltip.runtimeGameObject)
778 Vector2 privot = xAxis.position != Axis.AxisPosition.Top ?
new Vector2(0.5f, 1) : new Vector2(0.5f, 1);
779 var labelParent = tooltip.runtimeGameObject.transform;
780 var labelName = ChartCached.GetAxisTooltipLabel(objName);
781 GameObject labelObj = ChartHelper.AddTooltipLabel(labelName, labelParent, theme, privot);
782 xAxis.SetTooltipLabel(labelObj);
783 xAxis.SetTooltipLabelColor(theme.tooltip.labelBackgroundColor, theme.tooltip.labelTextColor);
784 xAxis.SetTooltipLabelActive(xAxis.show && tooltip.show && tooltip.type == Tooltip.Type.Corss);
787 xAxis.refreshComponent();
790 private void InitGrid()
792 for (
int i = 0; i < m_Grids.Count; i++)
794 var
grid = m_Grids[i];
796 grid.painter = m_Painter;
797 grid.refreshComponent = delegate ()
799 OnCoordinateChanged();
801 grid.refreshComponent();
805 private void InitDataZoom()
807 for (
int i = 0; i < m_DataZooms.Count; i++)
809 var dataZoom = m_DataZooms[i];
811 dataZoom.painter = m_PainterTop;
812 dataZoom.refreshComponent = delegate ()
814 var dataZoomObject = ChartHelper.AddObject(s_DefaultDataZoom + dataZoom.index, transform, graphAnchorMin,
815 graphAnchorMax, chartPivot,
new Vector2(chartWidth, chartHeight));
816 dataZoom.gameObject = dataZoomObject;
817 dataZoomObject.hideFlags = chartHideFlags;
818 ChartHelper.HideAllObject(dataZoomObject);
819 var startLabel = ChartHelper.AddTextObject(s_DefaultDataZoom +
"start", dataZoomObject.transform,
820 Vector2.zero, Vector2.zero,
new Vector2(1, 0.5f),
new Vector2(200, 20), dataZoom.textStyle,
822 startLabel.SetAlignment(TextAnchor.MiddleRight);
823 var endLabel = ChartHelper.AddTextObject(s_DefaultDataZoom +
"end", dataZoomObject.transform,
824 Vector2.zero, Vector2.zero,
new Vector2(0, 0.5f),
new Vector2(200, 20), dataZoom.textStyle,
826 endLabel.SetAlignment(TextAnchor.MiddleLeft);
827 dataZoom.SetStartLabel(startLabel);
828 dataZoom.SetEndLabel(endLabel);
829 dataZoom.SetLabelActive(
false);
830 CheckRaycastTarget();
831 foreach (var index
in dataZoom.xAxisIndexs)
833 var xAxis = m_XAxes[index];
836 xAxis.UpdateFilterData(dataZoom);
839 if (m_Series !=
null)
841 m_Series.UpdateFilterData(dataZoom);
844 dataZoom.refreshComponent();
848 private Vector3 GetLabelYPosition(
float scaleWid,
int i,
int yAxisIndex, YAxis yAxis)
850 var
grid = GetAxisGridOrDefault(yAxis);
851 var startX = yAxis.IsLeft() ?
grid.runtimeX :
grid.runtimeX +
grid.runtimeWidth;
853 var inside = yAxis.axisLabel.inside;
854 if ((inside && yAxis.IsLeft()) || (!inside && yAxis.IsRight()))
856 posX = startX + yAxis.axisLabel.margin;
860 posX = startX - yAxis.axisLabel.margin;
862 posX += yAxis.offset;
863 return new Vector3(posX,
grid.runtimeY + scaleWid, 0) + yAxis.axisLabel.textStyle.offsetv3;
866 private Vector3 GetLabelXPosition(
float scaleWid,
int i,
int xAxisIndex, XAxis xAxis)
868 var
grid = GetAxisGridOrDefault(xAxis);
869 var startY =
grid.runtimeY + (xAxis.axisLabel.onZero ? m_YAxes[xAxisIndex].runtimeZeroYOffset : 0);
870 if (xAxis.IsTop()) startY +=
grid.runtimeHeight;
872 var inside = xAxis.axisLabel.inside;
873 var fontSize = xAxis.axisLabel.textStyle.GetFontSize(m_Theme.axis);
874 if ((inside && xAxis.IsBottom()) || (!inside && xAxis.IsTop()))
876 posY = startY + xAxis.axisLabel.margin + fontSize / 2;
880 posY = startY - xAxis.axisLabel.margin - fontSize / 2;
882 posY += xAxis.offset;
883 return new Vector3(
grid.runtimeX + scaleWid, posY) + xAxis.axisLabel.textStyle.offsetv3;
886 protected virtual void CheckMinMaxValue()
888 if (m_XAxes ==
null || m_YAxes ==
null)
return;
889 for (
int i = 0; i < m_XAxes.Count; i++)
891 UpdateAxisMinMaxValue(i, m_XAxes[i]);
893 for (
int i = 0; i < m_YAxes.Count; i++)
895 UpdateAxisMinMaxValue(i, m_YAxes[i]);
899 private void UpdateAxisMinMaxValue(
int axisIndex, Axis axis,
bool updateChart =
true)
901 if (!axis.show)
return;
902 if (axis.IsCategory())
904 axis.runtimeMinValue = 0;
905 axis.runtimeMaxValue = SeriesHelper.GetMaxSerieDataCount(m_Series) - 1;
908 double tempMinValue = 0;
909 double tempMaxValue = 0;
910 GetSeriesMinMaxValue(axis, axisIndex, out tempMinValue, out tempMaxValue);
911 if (tempMinValue != axis.runtimeMinValue || tempMaxValue != axis.runtimeMaxValue)
913 m_IsPlayingAnimation =
true;
914 var needCheck = !m_IsPlayingAnimation && axis.runtimeLastCheckInverse == axis.inverse;
915 axis.UpdateMinValue(tempMinValue, needCheck);
916 axis.UpdateMaxValue(tempMaxValue, needCheck);
917 axis.runtimeZeroXOffset = 0;
918 axis.runtimeZeroYOffset = 0;
919 axis.runtimeLastCheckInverse = axis.inverse;
920 if (tempMinValue != 0 || tempMaxValue != 0)
922 var
grid = GetAxisGridOrDefault(axis);
923 if (
grid !=
null && axis is XAxis && axis.IsValue())
925 axis.runtimeZeroXOffset = axis.runtimeMinValue > 0 ? 0 :
926 axis.runtimeMaxValue < 0 ?
grid.runtimeWidth :
927 (float)(Math.Abs(axis.runtimeMinValue) * (
grid.runtimeWidth / (Math.Abs(axis.runtimeMinValue) + Math.Abs(axis.runtimeMaxValue))));
929 if (
grid !=
null && axis is YAxis && axis.IsValue())
931 axis.runtimeZeroYOffset = axis.runtimeMinValue > 0 ? 0 :
932 axis.runtimeMaxValue < 0 ?
grid.runtimeHeight :
933 (float)(Math.Abs(axis.runtimeMinValue) * (
grid.runtimeHeight / (Math.Abs(axis.runtimeMinValue) + Math.Abs(axis.runtimeMaxValue))));
936 var dataZoom = DataZoomHelper.GetAxisRelatedDataZoom(axis, dataZooms);
937 if (dataZoom !=
null && dataZoom.enable)
939 if (axis is XAxis) dataZoom.SetXAxisIndexValueInfo(axisIndex, tempMinValue, tempMaxValue);
940 else dataZoom.SetYAxisIndexValueInfo(axisIndex, tempMinValue, tempMaxValue);
944 UpdateAxisLabelText(axis);
948 if (axis.IsValueChanging(500) && !m_IsPlayingAnimation)
950 UpdateAxisLabelText(axis);
955 protected virtual void GetSeriesMinMaxValue(Axis axis,
int axisIndex, out
double tempMinValue, out
double tempMaxValue)
961 SeriesHelper.GetXMinMaxValue(m_Series,
null, axisIndex,
true, axis.inverse, out tempMinValue, out tempMaxValue);
965 SeriesHelper.GetYMinMaxValue(m_Series,
null, axisIndex,
true, axis.inverse, out tempMinValue, out tempMaxValue);
970 SeriesHelper.GetYMinMaxValue(m_Series,
null, axisIndex,
false, axis.inverse, out tempMinValue, out tempMaxValue);
972 AxisHelper.AdjustMinMaxValue(axis, ref tempMinValue, ref tempMaxValue,
true);
975 protected void UpdateAxisLabelText(Axis axis)
977 var
grid = GetAxisGridOrDefault(axis);
978 if (
grid ==
null || axis ==
null)
return;
979 float runtimeWidth = axis is XAxis ?
grid.runtimeWidth :
grid.runtimeHeight;
980 var isPercentStack = SeriesHelper.IsPercentStack(m_Series,
SerieType.Bar);
981 var dataZoom = DataZoomHelper.GetAxisRelatedDataZoom(axis, dataZooms);
982 axis.UpdateLabelText(runtimeWidth, dataZoom, isPercentStack, 500);
985 protected virtual void OnCoordinateChanged()
988 for (
int i = 0; i < m_XAxes.Count; i++)
990 m_XAxes[i].SetAllDirty();
992 for (
int i = 0; i < m_YAxes.Count; i++)
994 m_YAxes[i].SetAllDirty();
998 protected override void OnSizeChanged()
1000 base.OnSizeChanged();
1001 OnCoordinateChanged();
1004 private void DrawCoordinate(VertexHelper vh)
1007 for (
int i = 0; i < m_XAxes.Count; i++)
1009 m_XAxes[i].index = i;
1010 DrawXAxisSplit(vh, i, m_XAxes[i]);
1012 for (
int i = 0; i < m_YAxes.Count; i++)
1014 m_YAxes[i].index = i;
1015 DrawYAxisSplit(vh, i, m_YAxes[i]);
1017 for (
int i = 0; i < m_XAxes.Count; i++)
1019 DrawXAxisLine(vh, i, m_XAxes[i]);
1021 for (
int i = 0; i < m_YAxes.Count; i++)
1023 DrawYAxisLine(vh, i, m_YAxes[i]);
1027 private void DrawAxisTick(VertexHelper vh)
1029 for (
int i = 0; i < m_XAxes.Count; i++)
1031 DrawXAxisTick(vh, i, m_XAxes[i]);
1033 for (
int i = 0; i < m_YAxes.Count; i++)
1035 DrawYAxisTick(vh, i, m_YAxes[i]);
1039 private void DrawGrid(VertexHelper vh)
1041 foreach (var
grid in m_Grids)
1045 var p1 =
new Vector2(
grid.runtimeX,
grid.runtimeY);
1046 var p2 =
new Vector2(
grid.runtimeX,
grid.runtimeY +
grid.runtimeHeight);
1047 var p3 =
new Vector2(
grid.runtimeX +
grid.runtimeWidth,
grid.runtimeY +
grid.runtimeHeight);
1048 var p4 =
new Vector2(
grid.runtimeX +
grid.runtimeWidth,
grid.runtimeY);
1054 private void DrawYAxisSplit(VertexHelper vh,
int yAxisIndex, YAxis yAxis)
1056 if (AxisHelper.NeedShowSplit(yAxis))
1058 var
grid = GetAxisGridOrDefault(yAxis);
1059 if (
grid ==
null)
return;
1060 var dataZoom = DataZoomHelper.GetAxisRelatedDataZoom(yAxis, dataZooms);
1061 var size = AxisHelper.GetScaleNumber(yAxis,
grid.runtimeWidth, dataZoom);
1062 var totalWidth =
grid.runtimeY;
1063 var xAxis = GetRelatedXAxis(yAxis);
1064 var zeroPos =
new Vector3(
grid.runtimeX + xAxis.runtimeZeroXOffset,
grid.runtimeY + yAxis.runtimeZeroYOffset);
1065 var lineColor = yAxis.splitLine.GetColor(m_Theme.axis.splitLineColor);
1066 var lineWidth = yAxis.splitLine.GetWidth(m_Theme.axis.lineWidth);
1067 var lineType = yAxis.splitLine.GetType(m_Theme.axis.splitLineType);
1068 for (
int i = 0; i < size; i++)
1070 var scaleWidth = AxisHelper.GetScaleWidth(yAxis,
grid.runtimeHeight, i + 1, dataZoom);
1071 float pY = totalWidth;
1072 if (yAxis.boundaryGap && yAxis.axisTick.alignWithLabel)
1074 pY -= scaleWidth / 2;
1076 if (yAxis.splitArea.show && i < size - 1)
1078 UGL.DrawQuadrilateral(vh,
new Vector2(
grid.runtimeX, pY),
1079 new Vector2(
grid.runtimeX +
grid.runtimeWidth, pY),
1080 new Vector2(
grid.runtimeX +
grid.runtimeWidth, pY + scaleWidth),
1081 new Vector2(
grid.runtimeX, pY + scaleWidth),
1082 yAxis.splitArea.GetColor(i, m_Theme.axis));
1084 if (yAxis.splitLine.show)
1086 if (!xAxis.axisLine.show || !xAxis.axisLine.onZero || zeroPos.y != pY)
1088 if (yAxis.splitLine.NeedShow(i))
1090 ChartDrawer.DrawLineStyle(vh, lineType, lineWidth,
new Vector3(
grid.runtimeX, pY),
1091 new Vector3(
grid.runtimeX +
grid.runtimeWidth, pY), lineColor);
1095 totalWidth += scaleWidth;
1100 private void DrawYAxisTick(VertexHelper vh,
int yAxisIndex, YAxis yAxis)
1102 if (AxisHelper.NeedShowSplit(yAxis))
1104 var
grid = GetAxisGridOrDefault(yAxis);
1105 var dataZoom = DataZoomHelper.GetAxisRelatedDataZoom(yAxis, dataZooms);
1106 var size = AxisHelper.GetScaleNumber(yAxis,
grid.runtimeWidth, dataZoom);
1107 var totalWidth =
grid.runtimeY;
1108 for (
int i = 0; i < size; i++)
1110 var scaleWidth = AxisHelper.GetScaleWidth(yAxis,
grid.runtimeHeight, i + 1, dataZoom);
1111 if (i == 0 && (!yAxis.axisTick.showStartTick || yAxis.axisTick.alignWithLabel))
1113 totalWidth += scaleWidth;
1116 if (i == size - 1 && !yAxis.axisTick.showEndTick)
1118 totalWidth += scaleWidth;
1121 if (yAxis.axisTick.show)
1124 float pY = totalWidth;
1125 if (yAxis.boundaryGap && yAxis.axisTick.alignWithLabel) pY -= scaleWidth / 2;
1126 var startX =
grid.runtimeX + GetYAxisOnZeroOffset(yAxis) + yAxis.offset;
1127 startX -= yAxis.axisLine.GetWidth(m_Theme.axis.lineWidth);
1128 if (yAxis.IsValue() && yAxis.IsRight()) startX +=
grid.runtimeWidth;
1129 bool inside = yAxis.axisTick.inside;
1130 if ((inside && yAxis.IsLeft()) || (!inside && yAxis.IsRight()))
1132 pX += startX + yAxis.axisTick.GetLength(m_Theme.axis.tickLength);
1136 pX += startX - yAxis.axisTick.GetLength(m_Theme.axis.tickLength);
1138 UGL.DrawLine(vh,
new Vector3(startX, pY),
new Vector3(pX, pY),
1139 yAxis.axisTick.GetWidth(m_Theme.axis.tickWidth),
1140 yAxis.axisTick.GetColor(m_Theme.axis.tickColor));
1142 totalWidth += scaleWidth;
1145 if (yAxis.show && yAxis.axisLine.show && yAxis.axisLine.showArrow)
1147 var
grid = GetAxisGridOrDefault(yAxis);
1148 var lineX =
grid.runtimeX + GetYAxisOnZeroOffset(yAxis);
1149 if (yAxis.IsValue() && yAxis.IsRight()) lineX +=
grid.runtimeWidth;
1150 var inverse = yAxis.IsValue() && yAxis.inverse;
1151 var axisArrow = yAxis.axisLine.arrow;
1154 var startPos =
new Vector3(lineX,
grid.runtimeY +
grid.runtimeHeight);
1155 var arrowPos =
new Vector3(lineX,
grid.runtimeY);
1156 UGL.DrawArrow(vh, startPos, arrowPos, axisArrow.width, axisArrow.height,
1157 axisArrow.offset, axisArrow.dent,
1158 axisArrow.GetColor(yAxis.axisLine.GetColor(m_Theme.axis.lineColor)));
1162 var lineWidth = yAxis.axisLine.GetWidth(m_Theme.axis.lineWidth);
1163 var startPos =
new Vector3(lineX,
grid.runtimeX);
1164 var arrowPos =
new Vector3(lineX,
grid.runtimeY +
grid.runtimeHeight + lineWidth);
1165 UGL.DrawArrow(vh, startPos, arrowPos, axisArrow.width, axisArrow.height,
1166 axisArrow.offset, axisArrow.dent,
1167 axisArrow.GetColor(yAxis.axisLine.GetColor(m_Theme.axis.lineColor)));
1172 private void DrawXAxisSplit(VertexHelper vh,
int xAxisIndex, XAxis xAxis)
1174 if (AxisHelper.NeedShowSplit(xAxis))
1176 var
grid = GetAxisGridOrDefault(xAxis);
1177 if (
grid ==
null)
return;
1178 var dataZoom = DataZoomHelper.GetAxisRelatedDataZoom(xAxis, dataZooms);
1179 var size = AxisHelper.GetScaleNumber(xAxis,
grid.runtimeWidth, dataZoom);
1180 var totalWidth =
grid.runtimeX;
1181 var yAxis = m_YAxes[xAxisIndex];
1182 var zeroPos =
new Vector3(
grid.runtimeX,
grid.runtimeY + yAxis.runtimeZeroYOffset);
1183 var lineColor = xAxis.splitLine.GetColor(m_Theme.axis.splitLineColor);
1184 var lineWidth = xAxis.splitLine.GetWidth(m_Theme.axis.lineWidth);
1185 var lineType = xAxis.splitLine.GetType(m_Theme.axis.splitLineType);
1186 for (
int i = 0; i < size; i++)
1188 var scaleWidth = AxisHelper.GetScaleWidth(xAxis,
grid.runtimeWidth, i + 1, dataZoom);
1189 float pX = totalWidth;
1190 if (xAxis.boundaryGap && xAxis.axisTick.alignWithLabel)
1192 pX -= scaleWidth / 2;
1194 if (xAxis.splitArea.show && i < size - 1)
1196 UGL.DrawQuadrilateral(vh,
new Vector2(pX,
grid.runtimeY),
1197 new Vector2(pX,
grid.runtimeY +
grid.runtimeHeight),
1198 new Vector2(pX + scaleWidth,
grid.runtimeY +
grid.runtimeHeight),
1199 new Vector2(pX + scaleWidth,
grid.runtimeY),
1200 xAxis.splitArea.GetColor(i, m_Theme.axis));
1202 if (xAxis.splitLine.show)
1204 if (!yAxis.axisLine.show || !yAxis.axisLine.onZero || zeroPos.x != pX)
1206 if (xAxis.splitLine.NeedShow(i))
1208 ChartDrawer.DrawLineStyle(vh, lineType, lineWidth,
new Vector3(pX,
grid.runtimeY),
1209 new Vector3(pX,
grid.runtimeY +
grid.runtimeHeight), lineColor);
1213 totalWidth += AxisHelper.GetScaleWidth(xAxis,
grid.runtimeWidth, i + 1, dataZoom);
1218 private void DrawXAxisTick(VertexHelper vh,
int xAxisIndex, XAxis xAxis)
1220 var
grid = GetAxisGridOrDefault(xAxis);
1221 if (AxisHelper.NeedShowSplit(xAxis))
1223 var dataZoom = DataZoomHelper.GetAxisRelatedDataZoom(xAxis, dataZooms);
1224 var size = AxisHelper.GetScaleNumber(xAxis,
grid.runtimeWidth, dataZoom);
1225 var totalWidth =
grid.runtimeX;
1226 var yAxis = m_YAxes[xAxisIndex];
1227 for (
int i = 0; i < size; i++)
1229 var scaleWidth = AxisHelper.GetScaleWidth(xAxis,
grid.runtimeWidth, i + 1, dataZoom);
1230 if (i == 0 && (!xAxis.axisTick.showStartTick || xAxis.axisTick.alignWithLabel))
1232 totalWidth += scaleWidth;
1235 if (i == size - 1 && !xAxis.axisTick.showEndTick)
1237 totalWidth += scaleWidth;
1240 if (xAxis.axisTick.show)
1242 float pX = totalWidth;
1244 if (xAxis.boundaryGap && xAxis.axisTick.alignWithLabel) pX -= scaleWidth / 2;
1245 var startY =
grid.runtimeY + xAxis.offset - xAxis.axisLine.GetWidth(m_Theme.axis.lineWidth);
1246 if (xAxis.IsTop()) startY +=
grid.runtimeHeight;
1247 else startY += GetXAxisOnZeroOffset(xAxis);
1248 bool inside = xAxis.axisTick.inside;
1249 if ((inside && xAxis.IsBottom()) || (!inside && xAxis.IsTop()))
1251 pY += startY + xAxis.axisTick.GetLength(m_Theme.axis.tickLength);
1255 pY += startY - xAxis.axisTick.GetLength(m_Theme.axis.tickLength);
1257 UGL.DrawLine(vh,
new Vector3(pX, startY),
new Vector3(pX, pY),
1258 xAxis.axisTick.GetWidth(m_Theme.axis.tickWidth),
1259 xAxis.axisTick.GetColor(m_Theme.axis.tickColor));
1261 totalWidth += scaleWidth;
1264 if (xAxis.show && xAxis.axisLine.show && xAxis.axisLine.showArrow)
1266 var lineY =
grid.runtimeY + xAxis.offset;
1267 if (xAxis.IsTop()) lineY +=
grid.runtimeHeight;
1268 else lineY += GetXAxisOnZeroOffset(xAxis);
1269 var inverse = xAxis.IsValue() && xAxis.inverse;
1270 var axisArrow = xAxis.axisLine.arrow;
1273 var startPos =
new Vector3(
grid.runtimeX +
grid.runtimeWidth, lineY);
1274 var arrowPos =
new Vector3(
grid.runtimeX, lineY);
1275 UGL.DrawArrow(vh, startPos, arrowPos, axisArrow.width, axisArrow.height,
1276 axisArrow.offset, axisArrow.dent,
1277 axisArrow.GetColor(xAxis.axisLine.GetColor(m_Theme.axis.lineColor)));
1281 var startPos =
new Vector3(
grid.runtimeX, lineY);
1282 var arrowPos =
new Vector3(
grid.runtimeX +
grid.runtimeWidth + xAxis.axisLine.GetWidth(m_Theme.axis.lineWidth), lineY);
1283 UGL.DrawArrow(vh, startPos, arrowPos, axisArrow.width, axisArrow.height,
1284 axisArrow.offset, axisArrow.dent,
1285 axisArrow.GetColor(xAxis.axisLine.GetColor(m_Theme.axis.lineColor)));
1290 private void DrawXAxisLine(VertexHelper vh,
int xAxisIndex, XAxis xAxis)
1292 if (xAxis.show && xAxis.axisLine.show)
1294 var
grid = GetAxisGridOrDefault(xAxis);
1295 var inverse = xAxis.IsValue() && xAxis.inverse;
1296 var offset = AxisHelper.GetAxisLineSymbolOffset(xAxis);
1297 var lineY =
grid.runtimeY + xAxis.offset;
1298 if (xAxis.IsTop()) lineY +=
grid.runtimeHeight;
1299 else lineY += GetXAxisOnZeroOffset(xAxis);
1300 var lineWidth = xAxis.axisLine.GetWidth(m_Theme.axis.lineWidth);
1301 var lineType = xAxis.axisLine.GetType(m_Theme.axis.lineType);
1302 var lineColor = xAxis.axisLine.GetColor(m_Theme.axis.lineColor);
1303 var left =
new Vector3(
grid.runtimeX - lineWidth - (inverse ? offset : 0), lineY);
1304 var right =
new Vector3(
grid.runtimeX +
grid.runtimeWidth + lineWidth + (!inverse ? offset : 0), lineY);
1305 ChartDrawer.DrawLineStyle(vh, lineType, lineWidth, left, right, lineColor);
1309 private void DrawYAxisLine(VertexHelper vh,
int yAxisIndex, YAxis yAxis)
1311 if (yAxis.show && yAxis.axisLine.show)
1313 var
grid = GetAxisGridOrDefault(yAxis);
1314 var offset = AxisHelper.GetAxisLineSymbolOffset(yAxis);
1315 var inverse = yAxis.IsValue() && yAxis.inverse;
1316 var lineX =
grid.runtimeX + yAxis.offset;
1317 if (yAxis.IsRight()) lineX +=
grid.runtimeWidth;
1318 else lineX += GetYAxisOnZeroOffset(yAxis);
1319 var lineWidth = yAxis.axisLine.GetWidth(m_Theme.axis.lineWidth);
1320 var lineType = yAxis.axisLine.GetType(m_Theme.axis.lineType);
1321 var lineColor = yAxis.axisLine.GetColor(m_Theme.axis.lineColor);
1322 var bottom =
new Vector3(lineX,
grid.runtimeY - lineWidth - (inverse ? offset : 0));
1323 var top =
new Vector3(lineX,
grid.runtimeY +
grid.runtimeHeight + lineWidth + (!inverse ? offset : 0));
1324 ChartDrawer.DrawLineStyle(vh, lineType, lineWidth, bottom, top, lineColor);
1330 protected void DrawXTooltipIndicator(VertexHelper vh)
1332 if (!tooltip.show || !tooltip.IsSelected())
return;
1333 if (tooltip.type == Tooltip.Type.None)
return;
1334 if (tooltip.runtimeGridIndex < 0)
return;
1336 var
grid = GetGrid(tooltip.runtimeGridIndex);
1337 if (
grid ==
null)
return;
1338 var lineType = tooltip.lineStyle.GetType(m_Theme.tooltip.lineType);
1339 var lineWidth = tooltip.lineStyle.GetWidth(m_Theme.tooltip.lineWidth);
1340 for (
int i = 0; i < m_XAxes.Count; i++)
1342 var xAxis = m_XAxes[i];
1343 if (!xAxis.show)
continue;
1344 if (tooltip.runtimeXValues[i] < 0)
continue;
1345 var dataZoom = DataZoomHelper.GetAxisRelatedDataZoom(xAxis, dataZooms);
1346 int dataCount = m_Series.list.Count > 0 ? m_Series.list[0].GetDataList(dataZoom).Count : 0;
1347 float splitWidth = AxisHelper.GetDataWidth(xAxis,
grid.runtimeWidth, dataCount, dataZoom);
1348 switch (tooltip.type)
1350 case Tooltip.Type.Corss:
1351 case Tooltip.Type.Line:
1352 float pX = (float)(
grid.runtimeX + tooltip.runtimeXValues[i] * splitWidth
1353 + (xAxis.boundaryGap ? splitWidth / 2 : 0));
1354 if (xAxis.IsValue()) pX = tooltip.runtimePointerPos.x;
1355 Vector2 sp =
new Vector2(pX,
grid.runtimeY);
1356 Vector2 ep =
new Vector2(pX,
grid.runtimeY +
grid.runtimeHeight);
1357 var lineColor = TooltipHelper.GetLineColor(tooltip, m_Theme);
1358 ChartDrawer.DrawLineStyle(vh, lineType, lineWidth, sp, ep, lineColor);
1359 if (tooltip.type == Tooltip.Type.Corss)
1361 sp =
new Vector2(
grid.runtimeX, tooltip.runtimePointerPos.y);
1362 ep =
new Vector2(
grid.runtimeX +
grid.runtimeWidth, tooltip.runtimePointerPos.y);
1363 ChartDrawer.DrawLineStyle(vh, lineType, lineWidth, sp, ep, lineColor);
1366 case Tooltip.Type.Shadow:
1367 float tooltipSplitWid = splitWidth < 1 ? 1 : splitWidth;
1368 pX = (float)(
grid.runtimeX + splitWidth * tooltip.runtimeXValues[i] -
1369 (xAxis.boundaryGap ? 0 : splitWidth / 2));
1370 if (xAxis.IsValue()) pX = (
float)tooltip.runtimeXValues[i];
1371 float pY =
grid.runtimeY +
grid.runtimeHeight;
1372 Vector3 p1 =
new Vector3(pX,
grid.runtimeY);
1373 Vector3 p2 =
new Vector3(pX, pY);
1374 Vector3 p3 =
new Vector3(pX + tooltipSplitWid, pY);
1375 Vector3 p4 =
new Vector3(pX + tooltipSplitWid,
grid.runtimeY);
1376 UGL.DrawQuadrilateral(vh, p1, p2, p3, p4, m_Theme.tooltip.areaColor);
1382 protected void DrawYTooltipIndicator(VertexHelper vh)
1384 if (!tooltip.show || !tooltip.IsSelected())
return;
1385 if (tooltip.type == Tooltip.Type.None)
return;
1386 if (tooltip.runtimeGridIndex < 0)
return;
1388 var
grid = GetGrid(tooltip.runtimeGridIndex);
1389 if (
grid ==
null)
return;
1390 var lineType = tooltip.lineStyle.GetType(m_Theme.tooltip.lineType);
1391 var lineWidth = tooltip.lineStyle.GetWidth(m_Theme.tooltip.lineWidth);
1392 for (
int i = 0; i < m_YAxes.Count; i++)
1394 var yAxis = m_YAxes[i];
1395 if (!yAxis.show)
continue;
1396 if (tooltip.runtimeYValues[i] < 0)
continue;
1397 var dataZoom = DataZoomHelper.GetAxisRelatedDataZoom(yAxis, dataZooms);
1398 int dataCount = m_Series.list.Count > 0 ? m_Series.list[0].GetDataList(dataZoom).Count : 0;
1399 float splitWidth = AxisHelper.GetDataWidth(yAxis,
grid.runtimeHeight, dataCount, dataZoom);
1400 switch (tooltip.type)
1402 case Tooltip.Type.Corss:
1403 case Tooltip.Type.Line:
1404 float pY = (float)(
grid.runtimeY + tooltip.runtimeYValues[i] * splitWidth + (yAxis.boundaryGap ? splitWidth / 2 : 0));
1405 Vector2 sp =
new Vector2(
grid.runtimeX, pY);
1406 Vector2 ep =
new Vector2(
grid.runtimeX +
grid.runtimeWidth, pY);
1407 var lineColor = TooltipHelper.GetLineColor(tooltip, m_Theme);
1408 ChartDrawer.DrawLineStyle(vh, lineType, lineWidth, sp, ep, lineColor);
1409 if (tooltip.type == Tooltip.Type.Corss)
1411 sp =
new Vector2(
grid.runtimeX, tooltip.runtimePointerPos.y);
1412 ep =
new Vector2(
grid.runtimeX +
grid.runtimeWidth, tooltip.runtimePointerPos.y);
1413 ChartDrawer.DrawLineStyle(vh, lineType, lineWidth, sp, ep, lineColor);
1416 case Tooltip.Type.Shadow:
1417 float tooltipSplitWid = splitWidth < 1 ? 1 : splitWidth;
1418 float pX =
grid.runtimeX +
grid.runtimeWidth;
1419 pY = (float)(
grid.runtimeY + splitWidth * tooltip.runtimeYValues[i] -
1420 (yAxis.boundaryGap ? 0 : splitWidth / 2));
1421 Vector3 p1 =
new Vector3(
grid.runtimeX, pY);
1422 Vector3 p2 =
new Vector3(
grid.runtimeX, pY + tooltipSplitWid);
1423 Vector3 p3 =
new Vector3(pX, pY + tooltipSplitWid);
1424 Vector3 p4 =
new Vector3(pX, pY);
1425 UGL.DrawQuadrilateral(vh, p1, p2, p3, p4, m_Theme.tooltip.areaColor);
1431 private void CheckRaycastTarget()
1433 var anyDataZoom =
false;
1434 foreach (var dataZoom
in dataZooms)
1436 if (dataZoom.enable) anyDataZoom =
true;
1438 var ray = anyDataZoom
1439 || (visualMap !=
null && visualMap.enable && visualMap.show && visualMap.calculable);
1440 if (raycastTarget != ray)
1442 raycastTarget = ray;
1446 public bool IsAnyYAxisIsCategory()
1448 foreach (var yAxis
in m_YAxes)
1450 if (yAxis.type == Axis.AxisType.Category)
1458 protected virtual void DrawLabelBackground(VertexHelper vh)
1460 var isYAxis = IsAnyYAxisIsCategory();
1461 for (
int n = 0; n < m_Series.Count; n++)
1463 var serie = m_Series.GetSerie(n);
1464 if (!serie.show)
continue;
1465 if (serie.IsPerformanceMode())
continue;
1466 if (!serie.IsCoordinateSerie())
continue;
1467 DataZoomHelper.GetSerieRelatedDataZoom(serie, dataZooms, out var xDataZoom, out var yDataZoom);
1468 var showData = serie.GetDataList(xDataZoom);
1469 for (
int j = 0; j < showData.Count; j++)
1471 var serieData = showData[j];
1472 if (serieData.labelObject ==
null)
continue;
1473 var serieLabel = SerieHelper.GetSerieLabel(serie, serieData, serieData.highlighted);
1474 serieData.index = j;
1475 if (serieLabel.show && j < serie.dataPoints.Count)
1477 var pos = serie.dataPoints[j];
1479 var isIngore = ChartHelper.IsIngore(pos);
1482 serieData.SetLabelActive(
false);
1486 Internal_RefreshLabelPosition(serie, serieData, serieLabel, pos, serie.type ==
SerieType.Bar, isYAxis);
1487 m_RefreshLabel =
true;
1488 if (serieLabel.show) DrawLabelBackground(vh, serie, serieData);
1493 serieData.SetLabelActive(
false);
1499 public void Internal_RefreshLabelPosition(Serie serie, SerieData serieData, SerieLabel serieLabel, Vector3 pos,
bool IsNeedCheckPosition,
bool isYAxis)
1501 if (IsNeedCheckPosition)
1503 var value = serieData.data[1];
1504 var zeroPos = Vector3.zero;
1505 var lastStackSerie = SeriesHelper.GetLastStackSerie(m_Series, serie.index);
1506 if (serieLabel.position == SerieLabel.Position.Bottom || serieLabel.position == SerieLabel.Position.Center)
1510 var xAxis = m_XAxes[serie.xAxisIndex];
1511 var
grid = GetAxisGridOrDefault(xAxis);
1512 zeroPos =
new Vector3(
grid.runtimeX + xAxis.runtimeZeroXOffset,
grid.runtimeY);
1516 var yAxis = m_YAxes[serie.yAxisIndex];
1517 var
grid = GetAxisGridOrDefault(yAxis);
1518 zeroPos =
new Vector3(
grid.runtimeX,
grid.runtimeY + yAxis.runtimeZeroYOffset);
1521 var bottomPos = lastStackSerie ==
null ? zeroPos : lastStackSerie.dataPoints[serieData.index];
1522 switch (serieLabel.position)
1524 case SerieLabel.Position.Center:
1526 pos = isYAxis ?
new Vector3(bottomPos.x + (pos.x - bottomPos.x) / 2, pos.y) :
1527 new Vector3(pos.x, bottomPos.y + (pos.y - bottomPos.y) / 2);
1529 case SerieLabel.Position.Bottom:
1530 pos = isYAxis ?
new Vector3(bottomPos.x, pos.y) : new Vector3(pos.x, bottomPos.y);
1534 serieData.labelPosition = pos;
1537 protected override void OnRefreshLabel()
1539 base.OnRefreshLabel();
1540 var isYAxis = IsAnyYAxisIsCategory();
1541 var anyPercentStack = SeriesHelper.IsPercentStack(m_Series,
SerieType.Bar);
1543 for (
int i = 0; i < m_Series.Count; i++)
1545 var serie = m_Series.GetSerie(i);
1546 if (serie.IsPerformanceMode())
continue;
1547 if (!serie.IsCoordinateSerie())
continue;
1548 var total = serie.yTotal;
1549 var isPercentStack = SeriesHelper.IsPercentStack(m_Series, serie.stack,
SerieType.Bar);
1550 DataZoomHelper.GetSerieRelatedDataZoom(serie, dataZooms, out var xDataZoom, out var yDataZoom);
1551 var showData = serie.GetDataList(xDataZoom);
1552 if (xDataZoom !=
null)
1553 ChartHelper.HideAllObject(m_SerieLabelRoot,
"label_" + i);
1554 for (
int j = 0; j < showData.Count; j++)
1556 var serieData = showData[j];
1557 if (serieData.labelObject ==
null)
continue;
1558 if (j >= serie.dataPoints.Count)
1560 serieData.SetLabelActive(
false);
1561 serieData.SetIconActive(
false);
1564 serieData.labelObject.SetActive(
true);
1565 var pos = serie.dataPoints[j];
1566 var serieLabel = SerieHelper.GetSerieLabel(serie, serieData);
1567 var iconStyle = SerieHelper.GetIconStyle(serie, serieData);
1569 var isIgnore = serie.IsIgnoreIndex(j);
1570 Internal_RefreshLabelPosition(serie, serieData, serieLabel, pos, serie.type ==
SerieType.Bar, isYAxis);
1571 serieData.labelObject.SetPosition(serieData.labelPosition);
1572 serieData.labelObject.UpdateIcon(iconStyle);
1573 if (serie.show && serieLabel.show && serieData.canShowLabel && !isIgnore)
1579 dimension = VisualMapHelper.GetDimension(visualMap, serieData.data.Count);
1582 SerieLabelHelper.ResetLabel(serieData.labelObject.label, serieLabel, theme, i);
1584 value = serieData.data[dimension];
1586 if (anyPercentStack && isPercentStack)
1588 var tempTotal = Internal_GetBarSameStackTotalValue(serie.stack, j,
SerieType.Custom);
1589 content = SerieLabelHelper.GetFormatterContent(serie, serieData, value, tempTotal,
1590 serieLabel, theme.GetColor(i));
1594 content = SerieLabelHelper.GetFormatterContent(serie, serieData, value, total,
1595 serieLabel, theme.GetColor(i));
1597 serieData.SetLabelActive(serieData.labelPosition != Vector3.zero);
1598 var invert = serieLabel.autoOffset
1600 && SerieHelper.IsDownPoint(serie, j)
1601 && !serie.areaStyle.show;
1602 serieData.labelObject.SetLabelPosition(invert ? -serieLabel.offset : serieLabel.offset);
1603 if (serieData.labelObject.SetText(content)) RefreshChart();
1607 serieData.SetLabelActive(
false);
1616 public void Internal_CheckClipAndDrawPolygon(VertexHelper vh, Vector3 p1, Vector3 p2, Vector3 p3, Vector3 p4,
1617 Color32 color,
bool clip, Grid
grid)
1619 Internal_CheckClipAndDrawPolygon(vh, p1, p2, p3, p4, color, color, clip,
grid);
1622 public void Internal_CheckClipAndDrawPolygon(VertexHelper vh, Vector3 p,
float radius, Color32 color,
1623 bool clip,
bool vertical, Grid
grid)
1625 if (!IsInChart(p))
return;
1627 UGL.DrawSquare(vh, p, radius, color);
1630 public void Internal_CheckClipAndDrawPolygon(VertexHelper vh, Vector3 p1, Vector3 p2, Vector3 p3, Vector3 p4,
1631 Color32 startColor, Color32 toColor,
bool clip, Grid
grid)
1633 ClampInChart(ref p1);
1634 ClampInChart(ref p2);
1635 ClampInChart(ref p3);
1636 ClampInChart(ref p4);
1639 p1 = ClampInGrid(
grid, p1);
1640 p2 = ClampInGrid(
grid, p2);
1641 p3 = ClampInGrid(
grid, p3);
1642 p4 = ClampInGrid(
grid, p4);
1645 UGL.DrawQuadrilateral(vh, p1, p2, p3, p4, startColor, toColor);
1648 public void Internal_CheckClipAndDrawPolygon(VertexHelper vh, ref Vector3 p1, ref Vector3 p2, ref Vector3 p3, ref Vector3 p4,
1649 Color32 startColor, Color32 toColor,
bool clip, Grid
grid)
1651 ClampInChart(ref p1);
1652 ClampInChart(ref p2);
1653 ClampInChart(ref p3);
1654 ClampInChart(ref p4);
1657 p1 = ClampInGrid(
grid, p1);
1658 p2 = ClampInGrid(
grid, p2);
1659 p3 = ClampInGrid(
grid, p3);
1660 p4 = ClampInGrid(
grid, p4);
1664 UGL.DrawQuadrilateral(vh, p1, p2, p3, p4, startColor, toColor);
1667 public void Internal_CheckClipAndDrawTriangle(VertexHelper vh, Vector3 p1, Vector3 p2, Vector3 p3, Color32 color,
1668 bool clip, Grid
grid)
1670 Internal_CheckClipAndDrawTriangle(vh, p1, p2, p3, color, color, color, clip,
grid);
1673 public void Internal_CheckClipAndDrawTriangle(VertexHelper vh, Vector3 p1, Vector3 p2, Vector3 p3, Color32 color,
1674 Color32 color2, Color32 color3,
bool clip, Grid
grid)
1676 if (!IsInChart(p1) || !IsInChart(p2) || !IsInChart(p3))
return;
1678 UGL.DrawTriangle(vh, p1, p2, p3, color, color2, color3);
1681 public void Internal_CheckClipAndDrawLine(VertexHelper vh, Vector3 p1, Vector3 p2,
float size, Color32 color,
1682 bool clip, Grid
grid)
1684 if (!IsInChart(p1) || !IsInChart(p2))
return;
1686 UGL.DrawLine(vh, p1, p2, size, color);
1689 public void Internal_CheckClipAndDrawSymbol(VertexHelper vh,
SerieSymbolType type,
float symbolSize,
float tickness,
1690 Vector3 pos, Color32 color, Color32 toColor, Color32 backgroundColor,
float gap,
bool clip,
float[] cornerRadius,
1691 Grid
grid, Vector3 startPos)
1693 if (!IsInChart(pos))
return;
1695 DrawSymbol(vh, type, symbolSize, tickness, pos, color, toColor, backgroundColor, gap, cornerRadius, startPos);
1698 public void Internal_CheckClipAndDrawZebraLine(VertexHelper vh, Vector3 p1, Vector3 p2,
float size,
float zebraWidth,
1699 float zebraGap, Color32 color, Color32 toColor,
bool clip, Grid
grid)
1701 ClampInChart(ref p1);
1702 ClampInChart(ref p2);
1703 UGL.DrawZebraLine(vh, p1, p2, size, zebraWidth, zebraGap, color, toColor);
1706 protected Color32 GetXLerpColor(Color32 areaColor, Color32 areaToColor, Vector3 pos, Grid
grid)
1708 if (ChartHelper.IsValueEqualsColor(areaColor, areaToColor))
return areaColor;
1709 return Color32.Lerp(areaToColor, areaColor, (pos.y -
grid.runtimeY) /
grid.runtimeHeight);
1712 protected Color32 GetYLerpColor(Color32 areaColor, Color32 areaToColor, Vector3 pos, Grid
grid)
1714 if (ChartHelper.IsValueEqualsColor(areaColor, areaToColor))
return areaColor;
1715 return Color32.Lerp(areaToColor, areaColor, (pos.x -
grid.runtimeX) /
grid.runtimeWidth);
1718 public Grid GetAxisGridOrDefault(Axis axis)
1720 var index = axis.gridIndex;
1721 if (index >= 0 && index < m_Grids.Count)
1723 return m_Grids[index];
1725 else if (m_Grids.Count > 0)
1735 public Grid GetDataZoomGridOrDefault(DataZoom dataZoom)
1738 if (dataZoom.xAxisIndexs !=
null && dataZoom.xAxisIndexs.Count > 0)
1740 var xAxis = GetXAxis(dataZoom.xAxisIndexs[0]);
1741 grid = GetGrid(xAxis.gridIndex);
1743 else if (dataZoom.yAxisIndexs !=
null && dataZoom.yAxisIndexs.Count > 0)
1745 var yAxis = GetYAxis(dataZoom.yAxisIndexs[0]);
1746 grid = GetGrid(yAxis.gridIndex);
1748 if (
grid ==
null)
return m_Grids[0];
1752 public Grid GetSerieGridOrDefault(Serie serie)
1754 var xAxis = GetSerieXAxisOrDefault(serie);
1755 var yAxis = GetSerieYAxisOrDefault(serie);
1756 Grid
grid = GetGrid(xAxis.gridIndex);
1757 if (xAxis.gridIndex != yAxis.gridIndex)
1759 Debug.LogErrorFormat(
"serie {0}:{1} xAxisIndex:{2} and yAxisIndex:{3} not in the same grid.",
1760 serie.index, serie.name, serie.xAxisIndex, serie.yAxisIndex);
1769 grid.index = xAxis.gridIndex;
1774 public XAxis GetSerieXAxisOrDefault(Serie serie)
1776 var axis = GetXAxis(serie.xAxisIndex);
1779 Debug.LogErrorFormat(
"serie {0}:{1} xAxisIndex:{2} not exist.", serie.index, serie.name, serie.xAxisIndex);
1785 public YAxis GetSerieYAxisOrDefault(Serie serie)
1787 var axis = GetYAxis(serie.yAxisIndex);
1790 Debug.LogErrorFormat(
"serie {0}:{1} yAxisIndex:{2} not exist.", serie.index, serie.name, serie.xAxisIndex);
1796 protected void UpdateSerieGridIndex()
1798 for (
int i = 0; i < m_Series.Count; i++)
1800 var serie = m_Series.GetSerie(i);
1802 var
grid = GetSerieGridOrDefault(serie);
1803 serie.runtimeGridIndex =
grid.index;
1807 public float GetXAxisOnZeroOffset(XAxis axis)
1809 if (!axis.axisLine.onZero)
return 0;
1810 foreach (var yAxis
in m_YAxes)
1812 if (yAxis.IsValue() && yAxis.gridIndex == axis.gridIndex)
return yAxis.runtimeZeroYOffset;
1817 public float GetYAxisOnZeroOffset(YAxis axis)
1819 if (!axis.axisLine.onZero)
return 0;
1820 foreach (var xAxis
in m_XAxes)
1822 if (xAxis.IsValue() && xAxis.gridIndex == axis.gridIndex)
return xAxis.runtimeZeroXOffset;
1827 public YAxis GetRelatedYAxis(XAxis axis)
1829 foreach (var yAxis
in m_YAxes)
1831 if (yAxis.gridIndex == axis.gridIndex)
return yAxis;
1836 public XAxis GetRelatedXAxis(YAxis axis)
1838 foreach (var xAxis
in m_XAxes)
1840 if (xAxis.gridIndex == axis.gridIndex)
return xAxis;