fix .instance() and RadarChart scene

This commit is contained in:
fenix-hub 2022-01-09 16:32:44 +01:00
parent c7ab170ceb
commit 20dc80b4b6
4 changed files with 253 additions and 261 deletions

View File

@ -15,260 +15,260 @@ distinct correlations, trade-offs, and a multitude of other comparative measures
""" """
func _get_property_list(): func _get_property_list():
return [ return [
# Chart Properties # Chart Properties
{ {
"hint": PROPERTY_HINT_NONE, "hint": PROPERTY_HINT_NONE,
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE, "usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
"name": "Chart_Properties/are_values_columns", "name": "Chart_Properties/are_values_columns",
"type": TYPE_BOOL "type": TYPE_BOOL
}, },
{ {
"hint": PROPERTY_HINT_RANGE, "hint": PROPERTY_HINT_RANGE,
"hint_string": "-1,100,1", "hint_string": "-1,100,1",
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE, "usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
"name": "Chart_Properties/labels_index", "name": "Chart_Properties/labels_index",
"type": TYPE_INT "type": TYPE_INT
}, },
{ {
"hint": PROPERTY_HINT_RANGE, "hint": PROPERTY_HINT_RANGE,
"hint_string": "-1,100,1", "hint_string": "-1,100,1",
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE, "usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
"name": "Chart_Properties/function_names_index", "name": "Chart_Properties/function_names_index",
"type": TYPE_INT "type": TYPE_INT
}, },
{ {
"hint": PROPERTY_HINT_NONE, "hint": PROPERTY_HINT_NONE,
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE, "usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
"name": "Chart_Properties/use_height_as_radius", "name": "Chart_Properties/use_height_as_radius",
"type": TYPE_BOOL "type": TYPE_BOOL
}, },
{ {
"hint": PROPERTY_HINT_RANGE, "hint": PROPERTY_HINT_RANGE,
"hint_string": "0,2000", "hint_string": "0,2000",
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE, "usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
"name": "Chart_Properties/radius", "name": "Chart_Properties/radius",
"type": TYPE_REAL "type": TYPE_REAL
}, },
# Chart Display # Chart Display
{ {
"hint": PROPERTY_HINT_RANGE, "hint": PROPERTY_HINT_RANGE,
"hint_string": "0.1,100", "hint_string": "0.1,100",
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE, "usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
"name": "Chart_Display/full_scale", "name": "Chart_Display/full_scale",
"type": TYPE_REAL "type": TYPE_REAL
}, },
# Chart Style # Chart Style
{ {
"hint": 24, "hint": 24,
"hint_string": "%d/%d:%s"%[TYPE_INT, PROPERTY_HINT_ENUM, "hint_string": "%d/%d:%s"%[TYPE_INT, PROPERTY_HINT_ENUM,
PoolStringArray(Point.SHAPES.keys()).join(",")], PoolStringArray(Point.SHAPES.keys()).join(",")],
"name": "Chart_Style/points_shape", "name": "Chart_Style/points_shape",
"type": TYPE_ARRAY, "type": TYPE_ARRAY,
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE "usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE
}, },
{ {
"hint": PROPERTY_HINT_NONE, "hint": PROPERTY_HINT_NONE,
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE, "usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
"name": "Chart_Style/function_colors", "name": "Chart_Style/function_colors",
"type": TYPE_COLOR_ARRAY "type": TYPE_COLOR_ARRAY
}, },
{ {
"hint": PROPERTY_HINT_NONE, "hint": PROPERTY_HINT_NONE,
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE, "usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
"name": "Chart_Style/outline_color", "name": "Chart_Style/outline_color",
"type": TYPE_COLOR "type": TYPE_COLOR
}, },
{ {
"hint": PROPERTY_HINT_NONE, "hint": PROPERTY_HINT_NONE,
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE, "usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
"name": "Chart_Style/grid_color", "name": "Chart_Style/grid_color",
"type": TYPE_COLOR "type": TYPE_COLOR
}, },
{ {
"class_name": "Font", "class_name": "Font",
"hint": PROPERTY_HINT_RESOURCE_TYPE, "hint": PROPERTY_HINT_RESOURCE_TYPE,
"hint_string": "Font", "hint_string": "Font",
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE, "usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
"name": "Chart_Style/font", "name": "Chart_Style/font",
"type": TYPE_OBJECT "type": TYPE_OBJECT
}, },
{ {
"class_name": "Font", "class_name": "Font",
"hint": PROPERTY_HINT_RESOURCE_TYPE, "hint": PROPERTY_HINT_RESOURCE_TYPE,
"hint_string": "Font", "hint_string": "Font",
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE, "usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
"name": "Chart_Style/bold_font", "name": "Chart_Style/bold_font",
"type": TYPE_OBJECT "type": TYPE_OBJECT
}, },
{ {
"hint": PROPERTY_HINT_NONE, "hint": PROPERTY_HINT_NONE,
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE, "usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
"name": "Chart_Style/font_color", "name": "Chart_Style/font_color",
"type": TYPE_COLOR "type": TYPE_COLOR
}, },
{ {
"hint": PROPERTY_HINT_ENUM, "hint": PROPERTY_HINT_ENUM,
"hint_string": PoolStringArray(ECUtilities.templates.keys()).join(","), "hint_string": PoolStringArray(ECUtilities.templates.keys()).join(","),
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE, "usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
"name": "Chart_Style/template", "name": "Chart_Style/template",
"type": TYPE_INT "type": TYPE_INT
}, },
{ {
"hint": PROPERTY_HINT_RANGE, "hint": PROPERTY_HINT_RANGE,
"hint_string": "0,360", "hint_string": "0,360",
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE, "usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
"name": "Chart_Modifiers/rotation", "name": "Chart_Modifiers/rotation",
"type": TYPE_REAL "type": TYPE_REAL
}, },
] ]
func structure_data(database : Array): func structure_data(database : Array):
# @x_values_index can be either a column or a row relative to x values # @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 # @y_values can be either a column or a row relative to y values
are_values_columns = invert_chart != are_values_columns are_values_columns = invert_chart != are_values_columns
match are_values_columns: match are_values_columns:
true: true:
for row in database.size(): for row in database.size():
var t_row : Array = [] var t_row : Array = []
for column in database[row].size(): for column in database[row].size():
if row == labels_index: if row == labels_index:
if column == function_names_index: if column == function_names_index:
pass pass
else: else:
x_labels.append(database[row][column]) x_labels.append(database[row][column])
else: else:
if column == function_names_index: if column == function_names_index:
y_labels.append(database[row][column]) y_labels.append(database[row][column])
else: else:
if typeof(database[row][column]) == TYPE_INT or typeof(database[row][column]) == TYPE_REAL: if typeof(database[row][column]) == TYPE_INT or typeof(database[row][column]) == TYPE_REAL:
t_row.append(database[row][column] as float) t_row.append(database[row][column] as float)
else: else:
t_row.append(database[row][column].replace(",", ".") as float) t_row.append(database[row][column].replace(",", ".") as float)
if not t_row.empty(): if not t_row.empty():
x_datas.append(t_row) x_datas.append(t_row)
false: false:
for row in database.size(): for row in database.size():
if row == function_names_index: if row == function_names_index:
y_labels = database[row] as PoolStringArray y_labels = database[row] as PoolStringArray
var x_temp_datas : PoolRealArray = [] var x_temp_datas : PoolRealArray = []
for column in database[row].size(): for column in database[row].size():
if column == labels_index: if column == labels_index:
x_labels.append(database[row][column] as String) x_labels.append(database[row][column] as String)
else: else:
x_temp_datas.append(database[row][column] as float) x_temp_datas.append(database[row][column] as float)
x_datas.append(x_temp_datas) x_datas.append(x_temp_datas)
if labels_index == -1 : if labels_index == -1 :
for data in x_datas[0].size(): for data in x_datas[0].size():
x_labels.append("Element %s" % data) x_labels.append("Element %s" % data)
if function_names_index == -1 : if function_names_index == -1 :
for data in x_datas.size(): for data in x_datas.size():
y_labels.append("Function %s" % data) y_labels.append("Function %s" % data)
func build_chart(): func build_chart():
SIZE = get_size() SIZE = get_size()
origin = OFFSET + SIZE/2 origin = OFFSET + SIZE/2
var radar_polygon : Array var radar_polygon : Array
func calculate_pass() : func calculate_pass() :
var ordered_max : Array var ordered_max : Array
for data in x_datas : for data in x_datas :
var ordered_data : Array = data.duplicate() var ordered_data : Array = data.duplicate()
ordered_data.sort() ordered_data.sort()
ordered_max.append(ordered_data.pop_back()) ordered_max.append(ordered_data.pop_back())
ordered_max.sort() ordered_max.sort()
var max_value : float = ordered_max.pop_back() var max_value : float = ordered_max.pop_back()
var dist = full_scale * pow(10.0,str(max_value).length()-2) var dist = full_scale * pow(10.0,str(max_value).length()-2)
var multi = 0 var multi = 0
var value = dist * multi var value = dist * multi
x_chors.append(value as String) x_chors.append(value as String)
while value < max_value: while value < max_value:
multi+=1 multi+=1
value = dist * multi value = dist * multi
x_chors.append(value as String) x_chors.append(value as String)
func calculate_coordinates(): func calculate_coordinates():
for chor in x_chors.size(): for chor in x_chors.size():
var inner_polyline : PoolVector2Array var inner_polyline : PoolVector2Array
var scalar_factor : float = (x_chors[chor] as float/x_chors.back() as float) var scalar_factor : float = (x_chors[chor] as float/x_chors.back() as float)
for function in functions: for function in functions:
var angle : float = ((2 * PI * function) / functions) - PI /2 + deg2rad(rotation) var angle : float = ((2 * PI * function) / functions) - PI /2 + deg2rad(rotation)
var x_coordinate : float = (radius if (not use_height_as_radius and radius<SIZE.y/2) else SIZE.y/2) * scalar_factor * cos(angle) + origin.x var x_coordinate : float = (radius if (not use_height_as_radius and radius<SIZE.y/2) else SIZE.y/2) * scalar_factor * cos(angle) + origin.x
var y_coordinate : float = (radius if (not use_height_as_radius and radius<SIZE.y/2) else SIZE.y/2) * scalar_factor * sin(angle) + origin.y var y_coordinate : float = (radius if (not use_height_as_radius and radius<SIZE.y/2) else SIZE.y/2) * scalar_factor * sin(angle) + origin.y
inner_polyline.append(Vector2(x_coordinate, y_coordinate)) inner_polyline.append(Vector2(x_coordinate, y_coordinate))
inner_polyline.append(inner_polyline[0]) inner_polyline.append(inner_polyline[0])
radar_polygon.append(inner_polyline) radar_polygon.append(inner_polyline)
for datas in x_datas: for datas in x_datas:
var function_positions : PoolVector2Array var function_positions : PoolVector2Array
var function_values : Array var function_values : Array
for data in datas.size(): for data in datas.size():
var scalar_factor : float = datas[data] /( x_chors.back() as float) var scalar_factor : float = datas[data] /( x_chors.back() as float)
var angle : float = ((2 * PI * data) / datas.size()) - PI/2 + deg2rad(rotation) var angle : float = ((2 * PI * data) / datas.size()) - PI/2 + deg2rad(rotation)
var x_coordinate : float = (radius if (not use_height_as_radius and radius<SIZE.y/2) else SIZE.y/2) * scalar_factor * cos(angle) + origin.x var x_coordinate : float = (radius if (not use_height_as_radius and radius<SIZE.y/2) else SIZE.y/2) * scalar_factor * cos(angle) + origin.x
var y_coordinate : float = (radius if (not use_height_as_radius and radius<SIZE.y/2) else SIZE.y/2) * scalar_factor * sin(angle) + origin.y var y_coordinate : float = (radius if (not use_height_as_radius and radius<SIZE.y/2) else SIZE.y/2) * scalar_factor * sin(angle) + origin.y
function_positions.append(Vector2(x_coordinate,y_coordinate)) function_positions.append(Vector2(x_coordinate,y_coordinate))
function_values.append([x_labels[data], datas[data]]) function_values.append([x_labels[data], datas[data]])
function_positions.append(function_positions[0]) function_positions.append(function_positions[0])
point_positions.append(function_positions) point_positions.append(function_positions)
point_values.append(function_values) point_values.append(function_values)
func _draw(): func _draw():
if Engine.editor_hint: if Engine.editor_hint:
return return
clean_points() clean_points()
draw_grid() draw_grid()
for function in point_positions.size(): for function in point_positions.size():
var function_color : Color = function_colors[function] var function_color : Color = function_colors[function]
draw_polygon(point_positions[function], [Color(function_color.r, function_color.g, function_color.b, 0.2)],[],null,null,true) draw_polygon(point_positions[function], [Color(function_color.r, function_color.g, function_color.b, 0.2)],[],null,null,true)
draw_polyline(point_positions[function], function_color, 2,true) draw_polyline(point_positions[function], function_color, 2,true)
for _function in point_values.size(): for _function in point_values.size():
var PointContainer : Control = Control.new() var PointContainer : Control = Control.new()
Points.add_child(PointContainer) Points.add_child(PointContainer)
for function_point in point_values[_function].size(): for function_point in point_values[_function].size():
var point : Point = point_node.instance() var point : Point = point_node.instance()
point.connect("_point_pressed",self,"point_pressed") point.connect("_point_pressed",self,"point_pressed")
point.connect("_mouse_entered",self,"show_data") point.connect("_mouse_entered",self,"show_data")
point.connect("_mouse_exited",self,"hide_data") point.connect("_mouse_exited",self,"hide_data")
point.create_point(points_shape[_function], function_colors[_function], point.create_point(points_shape[_function], function_colors[_function],
Color.white, point_positions[_function][function_point], Color.white, point_positions[_function][function_point],
point.format_value(point_values[_function][function_point], false, false), point.format_value(point_values[_function][function_point], false, false),
y_labels[_function]) y_labels[_function])
PointContainer.add_child(point) PointContainer.add_child(point)
func draw_grid(): func draw_grid():
for polyline in radar_polygon: for polyline in radar_polygon:
draw_polyline(polyline, grid_color, 1, true) draw_polyline(polyline, grid_color, 1, true)
var text : String = x_chors[radar_polygon.find(polyline)] as String var text : String = x_chors[radar_polygon.find(polyline)] as String
draw_string(font, polyline[0] - Vector2(font.get_string_size(text).x/2,-5), text, font_color) draw_string(font, polyline[0] - Vector2(font.get_string_size(text).x/2,-5), text, font_color)
if not radar_polygon.empty(): if not radar_polygon.empty():
draw_polyline(radar_polygon[radar_polygon.size()-1], outline_color, 1, true) draw_polyline(radar_polygon[radar_polygon.size()-1], outline_color, 1, true)
for label in x_labels.size(): for label in x_labels.size():
var point_array : PoolVector2Array = radar_polygon[radar_polygon.size()-1] var point_array : PoolVector2Array = radar_polygon[radar_polygon.size()-1]
draw_line(origin, point_array[label], grid_color, 1, true) draw_line(origin, point_array[label], grid_color, 1, true)
if point_array[label].x != origin.x: if point_array[label].x != origin.x:
draw_string(font, point_array[label] - (Vector2(font.get_string_size(x_labels[label]).x+10,(5 if point_array[label].y <= origin.y else -10)) if point_array[label].x <= origin.x else - Vector2(10,(-5 if point_array[label].y <= origin.y else 10))), x_labels[label], font_color) draw_string(font, point_array[label] - (Vector2(font.get_string_size(x_labels[label]).x+10,(5 if point_array[label].y <= origin.y else -10)) if point_array[label].x <= origin.x else - Vector2(10,(-5 if point_array[label].y <= origin.y else 10))), x_labels[label], font_color)
else: else:
draw_string(font, point_array[label] - (Vector2(font.get_string_size(x_labels[label]).x/2, 10) if point_array[label].y < origin.x else - Vector2(font.get_string_size(x_labels[label]).x/2, 5)), x_labels[label], font_color) draw_string(font, point_array[label] - (Vector2(font.get_string_size(x_labels[label]).x/2, 10) if point_array[label].y < origin.x else - Vector2(font.get_string_size(x_labels[label]).x/2, 5)), x_labels[label], font_color)
func create_legend(): func create_legend():
pass pass
# legend.clear() # legend.clear()
# for function in functions: # for function in functions:
# var function_legend = FunctionLegend.instance() # var function_legend = FunctionLegend.instance()
@ -282,5 +282,5 @@ func create_legend():
# legend.append(function_legend) # legend.append(function_legend)
func count_functions(): func count_functions():
if x_labels.size(): if x_labels.size():
functions = x_labels.size() functions = x_labels.size()

View File

@ -1,16 +1,7 @@
[gd_scene load_steps=3 format=2] [gd_scene load_steps=3 format=2]
<<<<<<<< HEAD:addons/easy_charts/ControlChart/RadarChart/radar_chart.tscn
[ext_resource path="res://addons/easy_charts/Utilities/Point/point_data.tscn" type="PackedScene" id=1]
[ext_resource path="res://addons/easy_charts/ControlChart/RadarChart/radar_chart.gd" type="Script" id=2]
[sub_resource type="Theme" id=1]
========
[ext_resource path="res://addons/easy_charts/control_charts/RadarChart/radar_chart.gd" type="Script" id=1] [ext_resource path="res://addons/easy_charts/control_charts/RadarChart/radar_chart.gd" type="Script" id=1]
[ext_resource path="res://addons/easy_charts/utilities/containers/data_tooltip/data_tooltip.tscn" type="PackedScene" id=2] [ext_resource path="res://addons/easy_charts/utilities/containers/data_tooltip/data_tooltip.tscn" type="PackedScene" id=2]
>>>>>>>> dev:addons/easy_charts/control_charts/RadarChart/radar_chart.tscn
[node name="RadarChart" type="Control"] [node name="RadarChart" type="Control"]
anchor_right = 1.0 anchor_right = 1.0
@ -83,7 +74,7 @@ __meta__ = {
[node name="CanvasLayer" type="CanvasLayer" parent="."] [node name="CanvasLayer" type="CanvasLayer" parent="."]
[node name="DataTooltip" parent="CanvasLayer" instance=ExtResource( 2 )] [node name="DataTooltip" parent="CanvasLayer" instance=ExtResource( 2 )]
margin_left = -473.792 margin_left = -15.644
margin_top = 853.111 margin_top = -15.8509
margin_right = -473.928 margin_right = -15.78
margin_bottom = 853.911 margin_bottom = -15.0509

View File

@ -148,8 +148,9 @@ var property_list: Array = []
# !! API v2 # !! API v2
static func instance(chart_type : int): static func instance(chart_type : int):
var chart_t : String = ECUtilities.get_chart_type(chart_type) var chart_t : Array = ECUtilities.get_chart_type(chart_type)
var chart : String = "res://addons/easy_charts/%s/%s.tscn" % [chart_t, chart_t] "res://addons/easy_charts/control_charts/RadarChart/radar_chart.tscn"
var chart : String = "res://addons/easy_charts/control_charts/%s/%s.tscn" % [chart_t[0], chart_t[1]]
return load(chart).instance() return load(chart).instance()
# .......................... Properties Manager .................................... # .......................... Properties Manager ....................................

View File

@ -6,11 +6,11 @@ var alphabet : String = "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z"
var plugin_name : String = "Easy Charts" var plugin_name : String = "Easy Charts"
var templates : Dictionary = {} var templates : Dictionary = {}
var chart_types : Dictionary = { var chart_types : Dictionary = {
0:"LineChart", 0:["LineChart","line_chart"],
1:"ColumnChart", 1:["ColumnChart","column_chart"],
2:"ScatterChart", 2:["ScatterChart","scatter_chart"],
3:"RadarChart", 3:["RadarChart","radar_chart"],
4:"PieChart" 4:["PieChart","pie_chart"]
} }
func _ready(): func _ready():
@ -33,7 +33,7 @@ func _load_templates() -> Dictionary:
func get_template(template_index : int): func get_template(template_index : int):
return templates.get(templates.keys()[template_index]) return templates.get(templates.keys()[template_index])
func get_chart_type(chart_type : int): func get_chart_type(chart_type : int) -> Array:
return chart_types.get(chart_types.keys()[chart_type]) return chart_types.get(chart_types.keys()[chart_type])
func get_letter_index(index : int) -> String: func get_letter_index(index : int) -> String: