From 536c11e5b514fd47cdfdd5faeaecbf4807a42e78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Santilio?= Date: Mon, 21 Dec 2020 18:56:55 +0100 Subject: [PATCH] update v0.4.6 --- addons/easy_charts/BarChart/BarChart.gd | 2 +- addons/easy_charts/PieChart/PieChart.tscn | 9 +- addons/easy_charts/PieChart/pie_chart.gd | 8 +- addons/easy_charts/RadarChart/RadarChart.tscn | 10 +- addons/easy_charts/RadarChart/radar_chart.gd | 288 ++++++++++++++++++ .../easy_charts/ScatterChart/ScatterChart.gd | 2 +- addons/easy_charts/plugin.cfg | 2 +- 7 files changed, 304 insertions(+), 17 deletions(-) create mode 100644 addons/easy_charts/RadarChart/radar_chart.gd diff --git a/addons/easy_charts/BarChart/BarChart.gd b/addons/easy_charts/BarChart/BarChart.gd index ffd0da4..80ac306 100644 --- a/addons/easy_charts/BarChart/BarChart.gd +++ b/addons/easy_charts/BarChart/BarChart.gd @@ -129,7 +129,7 @@ func _get_property_list(): }, { "hint": PROPERTY_HINT_ENUM, - "hint_string": PoolStringArray(TemplatesNames.keys()).join(","), + "hint_string": PoolStringArray(Utilities.templatess.keys()).join(","), "usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE, "name": "Chart_Style/template", "type": TYPE_INT diff --git a/addons/easy_charts/PieChart/PieChart.tscn b/addons/easy_charts/PieChart/PieChart.tscn index 1cf4ac8..348a2c7 100644 --- a/addons/easy_charts/PieChart/PieChart.tscn +++ b/addons/easy_charts/PieChart/PieChart.tscn @@ -53,10 +53,9 @@ __meta__ = { [node name="PointData" parent="." instance=ExtResource( 2 )] [node name="PointData" parent="PointData" index="0"] -visible = false -margin_left = -449.181 -margin_top = -266.881 -margin_right = -449.318 -margin_bottom = -266.082 +margin_left = -63.9924 +margin_top = -129.716 +margin_right = -64.0923 +margin_bottom = -128.916 [editable path="PointData"] diff --git a/addons/easy_charts/PieChart/pie_chart.gd b/addons/easy_charts/PieChart/pie_chart.gd index fc233c5..efe2ed1 100644 --- a/addons/easy_charts/PieChart/pie_chart.gd +++ b/addons/easy_charts/PieChart/pie_chart.gd @@ -68,7 +68,7 @@ func _get_property_list(): }, { "hint": PROPERTY_HINT_ENUM, - "hint_string": PoolStringArray(TemplatesNames.keys()).join(","), + "hint_string": PoolStringArray(Utilities.templates.keys()).join(","), "usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE, "name": "Chart_Style/template", "type": TYPE_INT @@ -91,7 +91,7 @@ func _ready(): pass func plot_placeholder() -> void: - datas = [ + data = [ ["United States",46], ["Great Britain",27], ["China",26], @@ -106,7 +106,7 @@ func plot_placeholder() -> void: Color.green, Color.blue ] - plot_from_array(datas) + plot_from_array(data) func structure_datas(database: Array, are_values_columns: bool, x_values_index: int): # @x_values_index can be either a column or a row relative to x values @@ -213,7 +213,7 @@ var mouse_on_slice : bool = false func _input(event): if event is InputEventMouseMotion: for area_idx in range(areas.size()): - if Geometry.is_point_in_polygon(event.global_position, areas[area_idx]): + if Geometry.is_point_in_polygon(event.global_position - rect_position, areas[area_idx]): mouse_on_slice = true mouse_on_area = area_idx show_slice_data(slices[area_idx]) diff --git a/addons/easy_charts/RadarChart/RadarChart.tscn b/addons/easy_charts/RadarChart/RadarChart.tscn index f8388db..f9aee6b 100644 --- a/addons/easy_charts/RadarChart/RadarChart.tscn +++ b/addons/easy_charts/RadarChart/RadarChart.tscn @@ -1,7 +1,7 @@ [gd_scene load_steps=4 format=2] [ext_resource path="res://addons/easy_charts/Utilities/Point/PointData.tscn" type="PackedScene" id=1] -[ext_resource path="res://addons/easy_charts/RadarChart/RadarChart.gd" type="Script" id=2] +[ext_resource path="res://addons/easy_charts/RadarChart/radar_chart.gd" type="Script" id=2] [sub_resource type="Theme" id=1] @@ -77,10 +77,10 @@ __meta__ = { [node name="PointData" parent="PointData" index="0"] visible = false -margin_left = 64.178 -margin_top = -142.43 -margin_right = 64.041 -margin_bottom = -141.631 +margin_left = -448.644 +margin_top = 721.085 +margin_right = -448.781 +margin_bottom = 721.884 theme = SubResource( 1 ) [editable path="PointData"] diff --git a/addons/easy_charts/RadarChart/radar_chart.gd b/addons/easy_charts/RadarChart/radar_chart.gd new file mode 100644 index 0000000..6f7bd29 --- /dev/null +++ b/addons/easy_charts/RadarChart/radar_chart.gd @@ -0,0 +1,288 @@ +tool +extends Chart +class_name RadarChart + +""" +[RadarChart] - General purpose node for Radar Charts +A radar chart is a graphical method of displaying multivariate data in the form +of a two-dimensional chart of three or more quantitative variables represented on axes +starting from the same point. The relative position and angle of the axes is typically +uninformative, but various heuristics, such as algorithms that plot data as the maximal +total area, can be applied to sort the variables (axes) into relative positions that reveal +distinct correlations, trade-offs, and a multitude of other comparative measures. + +/ source : Wikipedia / +""" + +func _get_property_list(): + return [ + # Chart Properties + { + "hint": PROPERTY_HINT_NONE, + "usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE, + "name": "Chart_Properties/are_values_columns", + "type": TYPE_BOOL + }, + { + "hint": PROPERTY_HINT_RANGE, + "hint_string": "-1,100,1", + "usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE, + "name": "Chart_Properties/labels_index", + "type": TYPE_INT + }, + { + "hint": PROPERTY_HINT_RANGE, + "hint_string": "-1,100,1", + "usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE, + "name": "Chart_Properties/function_names_index", + "type": TYPE_INT + }, + { + "hint": PROPERTY_HINT_NONE, + "usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE, + "name": "Chart_Properties/use_height_as_radius", + "type": TYPE_BOOL + }, + { + "hint": PROPERTY_HINT_RANGE, + "hint_string": "0,2000", + "usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE, + "name": "Chart_Properties/radius", + "type": TYPE_REAL + }, + + # Chart Display + { + "hint": PROPERTY_HINT_RANGE, + "hint_string": "0.1,100", + "usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE, + "name": "Chart_Display/full_scale", + "type": TYPE_REAL + }, + + # Chart Style + { + "hint": 24, + "hint_string": "%d/%d:%s"%[TYPE_INT, PROPERTY_HINT_ENUM, + PoolStringArray(PointShapes.keys()).join(",")], + "name": "Chart_Style/points_shape", + "type": TYPE_ARRAY, + "usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE + }, + { + "hint": PROPERTY_HINT_NONE, + "usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE, + "name": "Chart_Style/function_colors", + "type": TYPE_COLOR_ARRAY + }, + { + "hint": PROPERTY_HINT_NONE, + "usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE, + "name": "Chart_Style/outline_color", + "type": TYPE_COLOR + }, + { + "hint": PROPERTY_HINT_NONE, + "usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE, + "name": "Chart_Style/grid_color", + "type": TYPE_COLOR + }, + { + "class_name": "Font", + "hint": PROPERTY_HINT_RESOURCE_TYPE, + "hint_string": "Font", + "usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE, + "name": "Chart_Style/font", + "type": TYPE_OBJECT + }, + { + "class_name": "Font", + "hint": PROPERTY_HINT_RESOURCE_TYPE, + "hint_string": "Font", + "usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE, + "name": "Chart_Style/bold_font", + "type": TYPE_OBJECT + }, + { + "hint": PROPERTY_HINT_NONE, + "usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE, + "name": "Chart_Style/font_color", + "type": TYPE_COLOR + }, + { + "hint": PROPERTY_HINT_ENUM, + "hint_string": PoolStringArray(Utilities.templates.keys()).join(","), + "usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE, + "name": "Chart_Style/template", + "type": TYPE_INT + }, + { + "hint": PROPERTY_HINT_RANGE, + "hint_string": "0,360", + "usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE, + "name": "Chart_Modifiers/rotation", + "type": TYPE_REAL + }, + ] + +func structure_datas(database : Array, are_values_columns : bool, labels_index : int): + # @x_values_index can be either a column or a row relative to x values + # @y_values can be either a column or a row relative to y values + self.labels_index = labels_index + self.are_values_columns = are_values_columns + match are_values_columns: + true: + for row in database.size(): + var t_row : Array = [] + for column in database[row].size(): + if row == labels_index: + if column == function_names_index: + pass + else: + x_labels.append(database[row][column]) + else: + if column == function_names_index: + y_labels.append(database[row][column]) + else: + if typeof(database[row][column]) == TYPE_INT or typeof(database[row][column]) == TYPE_REAL: + t_row.append(database[row][column] as float) + else: + t_row.append(database[row][column].replace(",", ".") as float) + if not t_row.empty(): + x_datas.append(t_row) + false: + for row in database.size(): + if row == function_names_index: + y_labels = database[row] as PoolStringArray + + var x_temp_datas : PoolRealArray = [] + for column in database[row].size(): + if column == labels_index: + x_labels.append(database[row][column] as String) + else: + x_temp_datas.append(database[row][column] as float) + x_datas.append(x_temp_datas) + + + if labels_index == -1 : + for data in x_datas[0].size(): + x_labels.append("Element %s" % data) + + if function_names_index == -1 : + for data in x_datas.size(): + y_labels.append("Function %s" % data) + +func build_chart(): + SIZE = get_size() + origin = OFFSET + SIZE/2 + +var radar_polygon : Array + +func calculate_pass() : + var ordered_max : Array + for data in x_datas : + var ordered_data : Array = data.duplicate() + ordered_data.sort() + ordered_max.append(ordered_data.pop_back()) + ordered_max.sort() + var max_value : float = ordered_max.pop_back() + var dist = full_scale * pow(10.0,str(max_value).length()-2) + var multi = 0 + var value = dist * multi + x_chors.append(value as String) + while value < max_value: + multi+=1 + value = dist * multi + x_chors.append(value as String) + +func calculate_coordinates(): + for chor in x_chors.size(): + var inner_polyline : PoolVector2Array + var scalar_factor : float = (x_chors[chor] as float/x_chors.back() as float) + for function in functions: + var angle : float = ((2 * PI * function) / functions) - PI /2 + deg2rad(rotation) + var x_coordinate : float = (radius if (not use_height_as_radius and radius