AirControl  1.3.0
Open Source, Modular, and Extensible Flight Simulator For Deep Learning Research
SerieData.cs
1 /************************************************/
2 /* */
3 /* Copyright (c) 2018 - 2021 monitor1394 */
4 /* https://github.com/monitor1394 */
5 /* */
6 /************************************************/
7 
8 using System.Collections.Generic;
9 using UnityEngine;
10 using UnityEngine.UI;
11 
12 namespace XCharts
13 {
18  [System.Serializable]
19  public class SerieData : SubComponent
20  {
21  [SerializeField] private int m_Index;
22  [SerializeField] private int m_ParentIndex = -1;
23  [SerializeField] private string m_Name;
24  [SerializeField] private string m_Id;
25  [SerializeField] private bool m_Selected;
26  [SerializeField] private bool m_Ignore = false;
27  [SerializeField] private float m_Radius;
28  [SerializeField] private bool m_EnableIconStyle = false;
29  [SerializeField] private IconStyle m_IconStyle = new IconStyle();
30  [SerializeField] private bool m_EnableLabel = false;
31  [SerializeField] private SerieLabel m_Label = new SerieLabel();
32  [SerializeField] private bool m_EnableItemStyle = false;
33  [SerializeField] private ItemStyle m_ItemStyle = new ItemStyle();
34  [SerializeField] private bool m_EnableEmphasis = false;
35  [SerializeField] private Emphasis m_Emphasis = new Emphasis();
36  [SerializeField] private bool m_EnableSymbol = false;
37  [SerializeField] private SerieSymbol m_Symbol = new SerieSymbol();
38  [SerializeField] private List<double> m_Data = new List<double>();
39  [SerializeField] private List<int> m_Children = new List<int>();
40 
41  public ChartLabel labelObject { get; set; }
42 
43  private bool m_Show = true;
44  private float m_RtPieOutsideRadius;
45 
46  public int index { get { return m_Index; } set { m_Index = value; } }
47  public int parentIndex { get { return m_ParentIndex; } set { m_ParentIndex = value; } }
52  public string name { get { return m_Name; } set { m_Name = value; } }
56  public string id { get { return m_Id; } set { m_Id = value; } }
61  public string legendName { get { return string.IsNullOrEmpty(name) ? ChartCached.IntToStr(index) : name; } }
65  public float radius { get { return m_Radius; } set { m_Radius = value; } }
70  public bool selected { get { return m_Selected; } set { m_Selected = value; } }
74  public bool enableIconStyle { get { return m_EnableIconStyle; } set { m_EnableIconStyle = value; } }
79  public IconStyle iconStyle { get { return m_IconStyle; } set { m_IconStyle = value; } }
83  public bool enableLabel { get { return m_EnableLabel; } set { m_EnableLabel = value; } }
87  public SerieLabel label { get { return m_Label; } set { m_Label = value; } }
91  public bool enableItemStyle { get { return m_EnableItemStyle; } set { m_EnableItemStyle = value; } }
95  public ItemStyle itemStyle { get { return m_ItemStyle; } set { m_ItemStyle = value; } }
99  public bool enableEmphasis { get { return m_EnableEmphasis; } set { m_EnableEmphasis = value; } }
103  public Emphasis emphasis { get { return m_Emphasis; } set { m_Emphasis = value; } }
107  public bool enableSymbol { get { return m_EnableSymbol; } set { m_EnableSymbol = value; } }
111  public SerieSymbol symbol { get { return m_Symbol; } set { m_Symbol = value; } }
115  public bool ignore
116  {
117  get { return m_Ignore; }
118  set { if (PropertyUtil.SetStruct(ref m_Ignore, value)) SetVerticesDirty(); }
119  }
124  public List<double> data { get { return m_Data; } set { m_Data = value; } }
125  public List<int> children { get { return m_Children; } set { m_Children = value; } }
130  public bool show { get { return m_Show; } set { m_Show = value; } }
135  public bool highlighted { get; set; }
136  public Vector3 labelPosition { get; set; }
137  private bool m_CanShowLabel = true;
141  public bool canShowLabel { get { return m_CanShowLabel; } set { m_CanShowLabel = value; } }
142 
146  public float runtimePieStartAngle { get; internal set; }
150  public float runtimePieToAngle { get; internal set; }
154  public float runtimePieHalfAngle { get; internal set; }
158  public float runtimePieCurrAngle { get; internal set; }
162  public float runtimePieInsideRadius { get; internal set; }
166  public float runtimePieOutsideRadius
167  {
168  get
169  {
170  if (radius > 0) return radius;
171  else return m_RtPieOutsideRadius;
172  }
173  internal set
174  {
175  m_RtPieOutsideRadius = value;
176  }
177  }
181  public float runtimePieOffsetRadius { get; internal set; }
182  public Vector3 runtimePosition { get; set; }
186  public Rect runtimeRect { get; set; }
187  public Rect runtimeSubRect { get; set; }
188  public int runtimeLevel { get; set; }
189  public SerieData runtimeParent { get; set; }
190  public Color32 runtimeColor { get; set; }
191  public double runtimeArea { get; set; }
192  public float runtimeAngle { get; set; }
193  public Vector3 runtiemPieOffsetCenter { get; set; }
194  public float runtimeStackHig { get; set; }
195  public Image runtimeSymbol { get; set; }
196  public List<SerieData> runtimeChildren { get { return m_RuntimeChildren; } }
197 
198  private List<double> m_PreviousData = new List<double>();
199  private List<float> m_DataUpdateTime = new List<float>();
200  private List<bool> m_DataUpdateFlag = new List<bool>();
201  private List<Vector2> m_PolygonPoints = new List<Vector2>();
202  [System.NonSerialized]
203  private List<SerieData> m_RuntimeChildren = new List<SerieData>();
204 
205  public void Reset()
206  {
207  index = 0;
208  m_ParentIndex = -1;
209  labelObject = null;
210  highlighted = false;
211  m_Name = string.Empty;
212  m_Show = true;
213  m_Selected = false;
214  m_CanShowLabel = true;
215  m_EnableIconStyle = false;
216  m_EnableSymbol = false;
217  m_EnableLabel = false;
218  m_EnableEmphasis = false;
219  m_EnableItemStyle = false;
220  m_Radius = 0;
221  m_Data.Clear();
222  m_PreviousData.Clear();
223  m_PolygonPoints.Clear();
224  m_RuntimeChildren.Clear();
225  m_DataUpdateTime.Clear();
226  m_DataUpdateFlag.Clear();
227  m_IconStyle.Reset();
228  m_Label.Reset();
229  m_ItemStyle.Reset();
230  m_Emphasis.Reset();
231  }
232 
233  public double GetData(int index, bool inverse = false)
234  {
235  if (index >= 0 && index < m_Data.Count)
236  {
237  return inverse ? -m_Data[index] : m_Data[index];
238  }
239  else return 0;
240  }
241 
242  public double GetData(int index, double min, double max)
243  {
244  if (index >= 0 && index < m_Data.Count)
245  {
246  var value = m_Data[index];
247  if (value < min) return min;
248  else if (value > max) return max;
249  else return value;
250  }
251  else return 0;
252  }
253 
254  public double GetPreviousData(int index, bool inverse = false)
255  {
256  if (index >= 0 && index < m_PreviousData.Count)
257  {
258  return inverse ? -m_PreviousData[index] : m_PreviousData[index];
259  }
260  else return 0;
261  }
262 
263  public double GetFirstData(float animationDuration = 500f)
264  {
265  if (m_Data.Count > 0) return GetCurrData(0, animationDuration);
266  return 0;
267  }
268 
269  public double GetLastData()
270  {
271  if (m_Data.Count > 0) return m_Data[m_Data.Count - 1];
272  return 0;
273  }
274 
275  public double GetCurrData(int index, float animationDuration = 500f, bool inverse = false)
276  {
277  return GetCurrData(index, animationDuration, inverse, 0, 0);
278  }
279 
280  public double GetCurrData(int index, float animationDuration, bool inverse, double min, double max)
281  {
282  if (index < m_DataUpdateFlag.Count && m_DataUpdateFlag[index] && animationDuration > 0)
283  {
284  var time = Time.time - m_DataUpdateTime[index];
285  var total = animationDuration / 1000;
286 
287  var rate = time / total;
288  if (rate > 1) rate = 1;
289  if (rate < 1)
290  {
291  CheckLastData();
292  var curr = MathUtil.Lerp(GetPreviousData(index), GetData(index), rate);
293  if (min != 0 || max != 0)
294  {
295  if (inverse)
296  {
297  var temp = min;
298  min = -max;
299  max = -temp;
300  }
301  var pre = m_PreviousData[index];
302  if (pre < min)
303  {
304  m_PreviousData[index] = min;
305  curr = min;
306  }
307  else if (pre > max)
308  {
309  m_PreviousData[index] = max;
310  curr = max;
311  }
312  }
313  curr = inverse ? -curr : curr;
314  return curr;
315  }
316  else
317  {
318  m_DataUpdateFlag[index] = false;
319  return GetData(index, inverse);
320  }
321  }
322  else
323  {
324  return GetData(index, inverse);
325  }
326  }
327 
332  public double GetMaxData(bool inverse = false)
333  {
334  if (m_Data.Count == 0) return 0;
335  var temp = double.MinValue;
336  for (int i = 0; i < m_Data.Count; i++)
337  {
338  var value = GetData(i, inverse);
339  if (value > temp) temp = value;
340  }
341  return temp;
342  }
343 
348  public double GetMinData(bool inverse = false)
349  {
350  if (m_Data.Count == 0) return 0;
351  var temp = double.MaxValue;
352  for (int i = 0; i < m_Data.Count; i++)
353  {
354  var value = GetData(i, inverse);
355  if (value < temp) temp = value;
356  }
357  return temp;
358  }
359 
360  public bool UpdateData(int dimension, double value, bool updateAnimation, float animationDuration = 500f)
361  {
362  if (dimension >= 0 && dimension < data.Count)
363  {
364  CheckLastData();
365  m_PreviousData[dimension] = GetCurrData(dimension, animationDuration);
366  //m_PreviousData[dimension] = data[dimension];;
367  m_DataUpdateTime[dimension] = Time.time;
368  m_DataUpdateFlag[dimension] = updateAnimation;
369  data[dimension] = value;
370  return true;
371  }
372  return false;
373  }
374 
375  public bool UpdateData(int dimension, double value)
376  {
377  if (dimension >= 0 && dimension < data.Count)
378  {
379  data[dimension] = value;
380  return true;
381  }
382  return false;
383  }
384 
385  private void CheckLastData()
386  {
387  if (m_PreviousData.Count != m_Data.Count)
388  {
389  m_PreviousData.Clear();
390  m_DataUpdateTime.Clear();
391  m_DataUpdateFlag.Clear();
392  for (int i = 0; i < m_Data.Count; i++)
393  {
394  m_PreviousData.Add(m_Data[i]);
395  m_DataUpdateTime.Add(Time.time);
396  m_DataUpdateFlag.Add(false);
397  }
398  }
399  }
400 
401  public bool IsDataChanged()
402  {
403  foreach (var b in m_DataUpdateFlag)
404  if (b) return true;
405  return false;
406  }
407 
408  public float GetLabelWidth()
409  {
410  if (labelObject != null) return labelObject.GetLabelWidth();
411  else return 0;
412  }
413 
414  public float GetLabelHeight()
415  {
416  if (labelObject != null) return labelObject.GetLabelHeight();
417  return 0;
418  }
419 
420  public void SetLabelActive(bool flag)
421  {
422  if (labelObject != null) labelObject.SetLabelActive(flag);
423  }
424  public void SetIconActive(bool flag)
425  {
426  if (labelObject != null) labelObject.SetIconActive(flag);
427  }
428 
429  public void SetPolygon(Vector2 p1, Vector2 p2, Vector2 p3, Vector2 p4)
430  {
431  m_PolygonPoints.Clear();
432  m_PolygonPoints.Add(p1);
433  m_PolygonPoints.Add(p2);
434  m_PolygonPoints.Add(p3);
435  m_PolygonPoints.Add(p4);
436  }
437 
438  public bool IsInPolygon(Vector2 p)
439  {
440  if (m_PolygonPoints.Count == 0) return false;
441  var inside = false;
442  var j = m_PolygonPoints.Count - 1;
443  for (int i = 0; i < m_PolygonPoints.Count; j = i++)
444  {
445  var pi = m_PolygonPoints[i];
446  var pj = m_PolygonPoints[j];
447  if (((pi.y <= p.y && p.y < pj.y) || (pj.y <= p.y && p.y < pi.y)) &&
448  (p.x < (pj.x - pi.x) * (p.y - pi.y) / (pj.y - pi.y) + pi.x))
449  inside = !inside;
450  }
451  return inside;
452  }
453  }
454 }
XCharts.ChartLabel
Definition: ChartLabel.cs:13
XCharts.SerieData.runtimePieOffsetRadius
float runtimePieOffsetRadius
饼图数据项的偏移半径
Definition: SerieData.cs:181
XCharts.SerieData.itemStyle
ItemStyle itemStyle
单个数据项的样式设置。
Definition: SerieData.cs:95
XCharts.SerieData.runtimePieCurrAngle
float runtimePieCurrAngle
饼图数据项的当前角度(运行时自动计算)
Definition: SerieData.cs:158
XCharts.SerieData.enableLabel
bool enableLabel
是否启用单个数据项的标签设置。
Definition: SerieData.cs:83
XCharts.SerieData.runtimePieInsideRadius
float runtimePieInsideRadius
饼图数据项的内半径
Definition: SerieData.cs:162
XCharts.SerieData.legendName
string? legendName
数据项图例名称。当数据项名称不为空时,图例名称即为系列名称;反之则为索引index。
Definition: SerieData.cs:61
XCharts.SerieData.canShowLabel
bool canShowLabel
是否可以显示Label
Definition: SerieData.cs:141
XCharts.SerieData.radius
float radius
自定义半径。可用在饼图中自定义某个数据项的半径。
Definition: SerieData.cs:65
XCharts.SerieData.GetMinData
double GetMinData(bool inverse=false)
the mininum value. 最小值。
Definition: SerieData.cs:348
XCharts.SubComponent
Definition: ChartComponent.cs:71
XCharts.IconStyle
Definition: IconStyle.cs:14
XCharts.SerieData.show
bool show
[default:true] Whether the data item is showed. 该数据项是否要显示。
Definition: SerieData.cs:130
XCharts
Definition: RewardChart.cs:14
XCharts.SerieData.label
SerieLabel label
单个数据项的标签设置。
Definition: SerieData.cs:87
XCharts.SerieData.runtimePieStartAngle
float runtimePieStartAngle
饼图数据项的开始角度(运行时自动计算)
Definition: SerieData.cs:146
XCharts.SerieData.emphasis
Emphasis emphasis
单个数据项的高亮样式设置。
Definition: SerieData.cs:103
XCharts.SerieData.symbol
SerieSymbol symbol
单个数据项的标记设置。
Definition: SerieData.cs:111
XCharts.Emphasis
高亮的图形样式和文本标签样式。
Definition: Emphasis.cs:17
XCharts.SerieData.runtimePieHalfAngle
float runtimePieHalfAngle
饼图数据项的一半时的角度(运行时自动计算)
Definition: SerieData.cs:154
XCharts.SerieData.ignore
bool ignore
是否忽略数据。当为 true 时,数据不进行绘制。
Definition: SerieData.cs:116
XCharts.SerieData.enableIconStyle
bool enableIconStyle
是否启用单个数据项的图标设置。
Definition: SerieData.cs:74
XCharts.SerieData.enableItemStyle
bool enableItemStyle
是否启用单个数据项的样式。
Definition: SerieData.cs:91
XCharts.SerieLabel
Text label of chart, to explain some data information about graphic item like value,...
Definition: SerieLabel.cs:18
XCharts.SerieData.runtimeRect
Rect runtimeRect
绘制区域。
Definition: SerieData.cs:186
XCharts.SerieData.highlighted
bool highlighted
Whether the data item is highlighted. 该数据项是否被高亮,一般由鼠标悬停或图例悬停触发高亮。
Definition: SerieData.cs:135
XCharts.SerieData.runtimePieOutsideRadius
float runtimePieOutsideRadius
饼图数据项的外半径
Definition: SerieData.cs:167
XCharts.SerieData.enableSymbol
bool enableSymbol
是否启用单个数据项的标记设置。
Definition: SerieData.cs:107
XCharts.SerieSymbolType.Rect
@ Rect
正方形。可通过设置itemStyle的cornerRadius变成圆角矩形。
XCharts.SerieData.selected
bool selected
Whether the data item is selected. 该数据项是否被选中。
Definition: SerieData.cs:70
XCharts.ItemStyle
图形样式。
Definition: ItemStyle.cs:18
XCharts.SerieData.runtimePieToAngle
float runtimePieToAngle
饼图数据项的结束角度(运行时自动计算)
Definition: SerieData.cs:150
XCharts.SerieData.data
List< double > data
An arbitrary dimension data list of data item. 可指定任意维数的数值列表。
Definition: SerieData.cs:124
XCharts.SerieData.name
string name
the name of data item. 数据项名称。
Definition: SerieData.cs:52
XCharts.SerieData.GetMaxData
double GetMaxData(bool inverse=false)
the maxinum value. 最大值。
Definition: SerieData.cs:332
XCharts.SerieData.iconStyle
IconStyle iconStyle
the icon of data. 数据项图标样式。
Definition: SerieData.cs:79
XCharts.SerieData.enableEmphasis
bool enableEmphasis
是否启用单个数据项的高亮样式。
Definition: SerieData.cs:99
XCharts.SerieSymbol
系列数据项的标记的图形
Definition: SerieSymbol.cs:91
XCharts.SerieData
A data item of serie. 系列中的一个数据项。可存储数据名和1-n维的数据。
Definition: SerieData.cs:19